簡體   English   中英

使用ScheduledExecutorService時在何處執行計划任務的最終清理

[英]Where to perform final cleanup for a scheduled task when using a ScheduledExecutorService

任務是實現一個非常非常簡化的計算“雲”。 雲實例(“引擎”)應該定期向管理員發送保持活動消息(“命令”)。 我已經使用以下任務實現了這一點:

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實例是否有意義,還是我每次都可以創建一個新實例?

如我所見,您有2個選擇:

  1. 跟蹤“套接字池”中的套接字,並使用此池的“發送”方法。 然后,在關閉執行程序后,您將池關閉
  2. 擴展ScheduledThreadPoolExecutor,這可能會有些困難。 但是,API很干凈...請注意,您可以“裝飾”任務,也有一個“確定的”方法。

我喜歡“套接字池”的想法。 然后,如何處理連接取決於池(即,如果您具有持久連接,或者您為每個請求創建一個連接)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM