2011-11-02 52 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