Netty ctx.executor (). ScheduleAtFixedRate Задача также работает при закрытии канала - PullRequest
0 голосов
/ 22 марта 2019

Я использую версию netty 4.1.30.Final, задача сервера netty состоит в том, чтобы отправить расписание данных запроса устройства команды Modbus (1 минута).

Клиентская программа иногда повторно входит в систему, а затем канал не закрывается. канал другой раньше (похоже, устройство поддерживает несколько каналов). Я вручную закрыл предыдущее, но задание на период просыпается.

Netty init code

  // 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 голосов
/ 22 марта 2019

Поскольку EventExecutor является общим для разных Channel s, оно имеет понятие закрытого канала.Если вы хотите, чтобы он больше не работал, вам нужно позвонить ScheduledFuture.cancel().

...