Как в Netty проверить состояние открытых каналов | Zhbert’s Home
Zhbert's Home
Домашняя страничка Zhbert'а

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

СТАТЬИ / JAVA / КАК В NETTY ПРОВЕРИТЬ СОСТОЯНИЕ ОТКРЫТЫХ КАНАЛОВ

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

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

Первый — непосредственно 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();, например, передавать обработку какому-либо еще обработчику.