1

割り当ては、非常に単純化されたコンピューティング「クラウド」を実装することです。クラウド インスタンス (「エンジン」) は、定期的にキープアライブ メッセージ (「コマンド」) をスーパーバイザーに送信することになっています。次のタスクを使用してこれを実装しました。

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 インスタンスを保持することは理にかなっていますか、それとも毎回新しいものを作成できますか?

4

1 に答える 1

1

私が見たように、あなたには2つのオプションがあります:

  1. 「ソケット プール」内のソケットを追跡し、このプールの「送信」メソッドを使用します。次に、エグゼキュータをシャットダウンした後、プールをシャットダウンします
  2. 少し難しい可能性がある ScheduledThreadPoolExecutor を拡張します。しかし、API はきれいです...タスクを「装飾」できることに注意してください。また、「終了」メソッドもあります。

「ソケットプール」のアイデアが気に入っています。次に、接続の処理方法はプール次第です (つまり、永続的な接続があるか、要求ごとに作成するか)。

于 2011-12-05T03:24:17.563 に答える