我使用netty版本是4.1.30.Final
,netty服务器任务是发送modbus命令请求设备数据调度的时间(1分钟)。
客户端程序有时会反复登录,然后没有关闭通道。之前的通道是不同的(看起来设备保留了多个通道)。我手动关闭了上一个。但是期间任务正在唤醒。
网络初始化代码
// group is final EventExecutorGroup group = new DefaultEventExecutor();
.addLast(group, serverDataPacketHandler);
检查重复频道。 deviceIdentity是客户端程序唯一发送的消息。
// loginChannels is Map<String, Channel>
if (loginChannels.containsKey(deviceIdentity) && loginChannels.get(deviceIdentity) !=
ctx.channel()) {
// close prev one.
logger.info("repeatedly login");
loginChannels.get(deviceIdentity).close();
loginChannels.put(deviceIdentity, ctx.channel());
} else {
loginChannels.put(deviceIdentity, ctx.channel());
}
设备登录时
Channel channel = ctx.channel();
ctx.executor().scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
logger.info("task start .......");
// send modbus command
channel.writeAndFlush("01 04 00 00 00 01 crc crc");
}, 0, 60, TimeUnit.SECONDS);
结果:
任务运行时间不是1分钟。当客户端重复登录时。
答案 0 :(得分:0)
由于EventExecutor
在不同的Channel
之间共享,因此具有封闭通道的概念。如果您不想再运行它,则需要致电ScheduledFuture.cancel()
。