channel.close() 实际上会通过 channel.eventLoop().scheduleAtFixedRate() 停止计划任务吗?

Does channel.close() actually stop scheduled tasks by channel.eventLoop().scheduleAtFixedRate()?

我正在使用Netty开发一个设备控制程序(Tcp Server)。

我必须每 1 秒发送一次状态请求消息,因此我使用的方法 channel.eventLoop().scheduleAtFixedRate() 并且工作正常。

channel.eventLoop().scheduleAtFixedRate( () -> {
         channel.writeAndFlush("REQ MSG"); 
         System.out.println("REQ MSG"); 
}, 1000, 1000, TimeUnit.MILLISECONDS);

而当我调用channel.close()时,上面的定时任务自动停止了。

但是当我消除channel.writeAndFlush()调用channel.close()的时候,上面的定时任务并没有停止

channel.eventLoop().scheduleAtFixedRate( () -> {
         // channel.writeAndFlush("REQ MSG"); 
         System.out.println("REQ MSG"); 
}, 1000, 1000, TimeUnit.MILLISECONDS);

两者有什么区别?

应该没有任何区别...在这两种情况下,一旦您想停止任务,您都需要通过 future.cancel() 显式取消任务。

我在我的案例中找不到确切原因,按照我的建议,我按如下方式修复了它。

private final CopyOnWriteArrayList<ScheduledFuture<?>> userTaskFutures = new CopyOnWriteArrayList<>();

public void scheduleAtFixedRate(Runnable task, long initialDelay, long period, TimeUnit unit) {
    ScheduledFuture<?> future = channel.eventLoop().scheduleAtFixedRate(task, initialDelay, period, unit);
    userTaskFutures.add(future);
}

public void disconnect() {
    ... 
    if (!userTaskFutures.isEmpty()) {
        userTaskFutures.forEach(future -> future.cancel(true));
        userTaskFutures.clear();
    }
}