В соответствии с Netty javadoc , вы можете использовать класс IdleStateHandler
для закрытия незанятых соединений.По-видимому, этот обработчик будет вызывать IdleStateEvent
, когда в течение некоторого времени в соединении нет ни чтения, ни записи, либо обоих.Затем это событие можно использовать для запуска отключения соединения ... или для других действий.
Следующий пример скопирован из javadoc:
// An example that sends a ping message when there is no outbound traffic
// for 30 seconds. The connection is closed when there is no inbound traffic
// for 60 seconds.
public class MyChannelInitializer extends ChannelInitializer<Channel> {
@Override
public void initChannel(Channel channel) {
channel.pipeline().addLast("idleStateHandler", new IdleStateHandler(60, 30, 0));
channel.pipeline().addLast("myHandler", new MyHandler());
}
}
// Handler should handle the IdleStateEvent triggered by IdleStateHandler.
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(new PingMessage());
}
}
}
}
ServerBootstrap bootstrap = ...;
...
bootstrap.childHandler(new MyChannelInitializer());
...
Примечание: в соответствии с это Q & A , IdleStateHandler
должен быть первым обработчиком в конвейере.