当通道有一段时间没有执行读取、写入或同时执行这两种操作时,触发IdleStateEvent。
各参数含义:
readerIdleTime
当在指定的时间段内没有执行读取时,将触发IdleStateEvent 事件其状态为IdleState.READER_IDLE 。指定0以禁用。
writerIdleTime
当在指定的时间段内没有执行写入时,将触发IdleStateEvent 事件其状态为IdleState.WRITER_IDLE。指定0以禁用。
allIdleTime
当在指定的时间段内既没有执行读取也没有执行写入时,将触发IdleStateEvent 事件其状态为 IdleState.ALL_IDLE。指定0以禁用。
1. 例子
超过30秒没有往通道写入消息的时候,发送ping命令。超过60秒没有从通道读取到消息时,直接关闭通道。
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());
...
网友评论