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();
}
}
我正在使用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();
}
}