Netty ctx.executor()。scheduleAtFixedRate任务在通道关闭时也有效

时间:2019-03-22 01:24:34

标签: netty

我使用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分钟。当客户端重复登录时。

1 个答案:

答案 0 :(得分:0)

由于EventExecutor在不同的Channel之间共享,因此具有封闭通道的概念。如果您不想再运行它,则需要致电ScheduledFuture.cancel()