IdleStateHandler

2019-01-23  本文已影响24人  简书徐小耳

可以注册多个定时任务来进行读写和全部超时任务检测,也可以做心跳检测

observeOutput:代表我们的outbounderbuffer的数据是否有变更,如果有变更 那么write和allIde都不会触发。
先检测lastChangeCheckTimeStamp != lastWriteTime是否相等 如果不等且不是第一次则代表是由变更的 我们下面就不需要去计算剩余的bytebuf的hash和totalPendingWriteBytes的数量
为了防止链接数量过多,我们一般设置write或者All,因为就算read事件触发了 ,但是有可能我们还在发送数据,但是一般write很长时间没有用,那么也不会受到read。
注意fileRegin计算开启observeOutput也会算超时,因为一般文件很大,在这发送过程中其size固定为96(这是默认值),所以在这过程中就算比较totalPendingWriteBytes和bytebuf的hash也没有办法

readerIdleTime:代表多久没有收到read消息了,这个时候我们可以发送个心跳给对端看看tcp是否还online,如果不是则关闭

writerIdleTime:代表多久没有write消息了,如果时间过长 可以考虑关闭 也可以做心跳

allIdleTime:包含上面的几个事件

我们会在channelActive,channelRegistered方法时候初始化我们上山四个常量的值(内部通过state避免重复设置)
然后设置对应的定时任务。
当我们channelRead(可以更新读的超时时间),channelReadComplete可以更新lastReadTime用于observeOutput
,write方法通过添加监听者来更新写的时间,
定时任务触发时先重新设置定时任务,然后去检测在这期间时间是否超时,如果超时执行userEventTriggered 传递event,没有超时就
直接返回.
我们在destory的时候会去取消这些定时任务

上一篇下一篇

猜你喜欢

热点阅读