public IdleStateHandler(int readerIdleTimeSeconds, int writerIdleTimeSeconds, int allIdleTimeSeconds) {
this((long)readerIdleTimeSeconds, (long)writerIdleTimeSeconds, (long)allIdleTimeSeconds, TimeUnit.SECONDS);
}
名称 | 作用 |
---|---|
readerIdleTimeSeconds |
读超时。即当在指定的时间间隔内没有从Channel 读取到数据时,会触发一个READER_IDLE 的IdleStateEvent 事件 |
writerIdleTimeSeconds |
写超时。即当在指定的时间间隔内没有数据写入到Channel 时,会触发一个WRITER_IDLE 的IdleStateEvent 事件 |
allIdleTimeSeconds |
读/写超时。即当在指定的时间间隔内没有读或写操作时,会触发一个ALL_IDLE 的IdleStateEvent 事件 |
三、IdleStateHandler 源码
【1】handlerAdded
和handlerRemoved
:IdleStateHandler
是在创建IdleStateHandler
实例并添加到ChannelPipeline
时添加定时任务来进行定时检测的,具体在initialize(ctx)
方法实现;同时在从ChannelPipeline
移除或Channel
关闭时,移除这个定时检测,具体在destroy()
实现。IdleStateHandler
的channelActive()
方法在socket
通道建立时被触发。
public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
if (ctx.channel().isActive() && ctx.channel().isRegistered()) {
this.initialize(ctx);
}
}
public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
this.destroy();
}
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
this.destroy();
super.channelInactive(ctx);
}
【2】initialize
:根据配置的readerIdleTime
,WriteIdleTIme
等超时事件参数往任务队列taskQueue
中添加定时任务task
。我先先查看ReaderIdleTimeoutTask
的作用。
private void initialize(ChannelHandlerContext ctx) {
switch(this.state) {