割り当ては、非常に単純化されたコンピューティング「クラウド」を実装することです。クラウド インスタンス (「エンジン」) は、定期的にキープアライブ メッセージ (「コマンド」) をスーパーバイザーに送信することになっています。次のタスクを使用してこれを実装しました。
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()を使用して実行がスケジュールされています。長時間実行されるタスクへの明示的な参照を保持する必要がないように、shutdownNow()を使用して適切な (ish) シャットダウンを行っています。
タスクに固有のクリーンアップを実行する「クリーンな」方法はありますか (を閉じるDatagramSocket
)? あるいは、スケジュールされた実行間で DatagramSocket インスタンスを保持することは理にかなっていますか、それとも毎回新しいものを作成できますか?