Задача - реализовать очень и очень упрощенное вычислительное «облако». Облачные экземпляры («движки») должны регулярно отправлять сообщения поддержки («команды») супервизору. Я реализовал это, используя следующую задачу:
public class KeepAlive implements Runnable {
Engine engine;
DatagramSocket sock;
public KeepAlive(Engine engine) {
this.engine = engine;
sock = new DatagramSocket();
}
public void run() {
DatagramSocket sock = null;
EngineArguments args = engine.getArgs();
KeepAliveCommand cmd = new KeepAliveCommand(…);
byte[] data = cmd.toString().getBytes("UTF-8");
DatagramPacket p = new DatagramPacket(data, data.length, InetAddress.getByName(args.getSchedulerHost()), args.getSchedulerPort());
sock.send(p);
}
}
, который запланирован для выполнения с использованием scheduleAtFixedRate () . Я делаю изящное (ish) завершение использования shutdownNow () , чтобы избежать необходимости сохранять явные ссылки на долгосрочные задачи.
Есть ли какой-либо "чистый" способ выполнить очистку, специфичную для задачи (закрытие DatagramSocket
)? С другой стороны, имеет ли смысл хранить экземпляр DatagramSocket между запланированными запусками или я могу просто каждый раз создавать новый?