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

在我看来,您有两个选择:

  1. 跟踪“套接字池”中的套接字并使用该池的“发送”方法。然后,在您关闭执行程序后,您关闭了池
  2. 扩展 ScheduledThreadPoolExecutor,这可能有点困难。但是,API 是干净的......请注意,您可以“装饰”任务,还有一个“终止”方法。

我喜欢“套接字池”的想法。然后,如何处理连接取决于池(即,如果您有一个持久连接或者您为每个请求创建一个连接)

于 2011-12-05T03:24:17.563 回答