繁体   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