netty idlestatehandler неверное время задержки - PullRequest
0 голосов
/ 30 октября 2018

У меня есть пример, который использует Java 1.8 и Netty 4.1.30. Окончательная версия IdleStateHandler для вывода текущего времени, когда в течение 400 миллисекунд не предпринимается никаких действий. Однако текущее время выводится с интервалом в 2 секунды вместо 400 миллисекунд.

вот мой пример кода

Client.java

public void connect() {
    EventLoopGroup workerGroup = new OioEventLoopGroup();
    try {
        Bootstrap bootstrap = new Bootstrap();
        bootstrap.group(workerGroup)
                .channel(RxtxChannel.class)
                .option(RxtxChannelOption.BAUD_RATE, 38400)
                .option(RxtxChannelOption.DATA_BITS, RxtxChannelConfig.Databits.DATABITS_8)
                .option(RxtxChannelOption.PARITY_BIT, RxtxChannelConfig.Paritybit.NONE)
                .option(RxtxChannelOption.STOP_BITS, RxtxChannelConfig.Stopbits.STOPBITS_1)
                .handler(new ExampleChannelInitializer());
        this.channel = bootstrap.connect(new RxtxDeviceAddress("COM1")).sync().channel();
        this.channel.closeFuture().addListener(f -> {
            workerGroup.shutdownGracefully();
        });

    } catch (Exception e) {
        throw new ConnectionException(e.getMessage(), e);
    }
}

ExampleChannelInitializer.java

@Override
protected void initChannel(RxtxChannel ch) throws Exception {
    ChannelPipeline pipeline = ch.pipeline();

    pipeline.addLast(new IdleStateHandler(0, 0, 400, TimeUnit.MILLISECONDS));
    pipeline.addLast(new ChannelInboundHandlerAdapter() {
        @Override
        public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
            System.out.println(LocalDateTime.now());
        }
    });
}

Консоль

2018-10-30T10: 42: 02,762

2018-10-30T10: 42: 04,789

2018-10-30T10: 42: 06,818

2018-10-30T10: 42: 08,844

2018-10-30T10: 42: 10,871

1 Ответ

0 голосов
/ 31 октября 2018

Это, к сожалению, просто вопрос того, как OIO транспорт и так RXTX работают под капотом. Вы можете сделать их более «точными» с помощью RxtxChannelOption.READ_TIMEOUT и RxtxChannelOption.WAIT_TIME и установить для них меньшее значение.

...