2011-11-02 53 views
1

該任務旨在實現非常簡化的計算「雲」。雲實例(「引擎」)應該定期向主管發送保持活動消息(「命令」)。我實現了這個使用以下任務:使用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實例還是有意義的,或者我可以每次創建一個新的實例?

回答

1

在我看來,你有兩個選擇:一個「套接字池」,並使用該池的「發送」方法中的插座

  1. 跟蹤。 然後,關閉執行程序後關閉池
  2. 擴展ScheduledThreadPoolExecutor,這可能有點困難。但是,API是乾淨的...請注意,您可以「裝飾」任務,還有一個「終止」方法。

我喜歡「套接字池」的想法。然後,如何處理連接是由池(即如果你有一個持久的連接或你創建一個請求)

+0

我會接受這個,因爲我基本上去了#1,一起做幾乎所有的東西管理資源'Closeable'。 – millimoose