Нажмите "Enter", чтобы перейти к контенту

Как в Netty проверить состояние открытых каналов

Для этого можно использовать встроенный сервис Netty, который будет раз в определенное время пинговать устройство, и при неполучении ответа закрывать канал.

Для этого нужно создать два handlera, которые добавить в конфигурацию сервера.

Первый — непосредственно handler, отвечающий за обработку событий (пинг и закрытие канала)

public class MyHandler extends ChannelDuplexHandler {
        @Override
        public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
            if (evt instanceof IdleStateEvent) {
                IdleStateEvent e = (IdleStateEvent) evt
                if (e.state() == IdleState.READER_IDLE) {
                    ctx.close
                } else if (e.state() == IdleState.WRITER_IDLE) {
                    ctx.writeAndFlush(ok
                }
            }
        }
}

Второй: добавить этот хандлер и IdleStateHandler в pipeline

ServerBootstrap b = new ServerBootstrap // (2)
            b.group(bossGroup, workerGroup)
                    .channel(NioServerSocketChannel.class) // (3)
                    .childHandler(new ChannelInitializer<SocketChannel>() { // (4)
                        @Override
                        public void initChannel(SocketChannel ch) throws Exception {
                            ch.pipeline().addLast(
                                    new IdleStateHandler(60, 30, 0),
                                    new MyHandler(),
                                    new ChannelsStorage(),
                                    new DiscardServerHandler());
                        }
                    })
                    .option(ChannelOption.SO_BACKLOG, 128)          // (5)
                    .childOption(ChannelOption.SO_KEEPALIVE, true // (6)

У IdleStateHandler есть парамерты, такие как время пинга, здесь он задан 60 секунд на чтение и 30 секунд на запись (взяты дефолтные параметры из мануала).

Теперь раз в заданный промежуток времени Netty будет проверять доступность канала, и закрывать его, если с той стороны нет ответа. Обработки можно дописать свою после ctx.close();, например, передавать обработку какому-либо еще обработчику.

Подписаться
Уведомить о
guest

Капча загружается...

0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии