Netty心跳检测篇之IdleStateHandler
来源:互联网 发布:腾讯tim ubuntu 编辑:程序博客网 时间:2024/05/22 05:12
Netty提供了对心跳机制的天然支持,心跳检测可以检测远程端是否存活,或者活跃。
今天,我们就一起初识一下Netty4的心跳机制。
Netty4.0提供了一个类,名为IdleStateHandler,这个类可以进行三种类型的心跳检测。
这个类的构造参数是这样的:
前三个的参数解释如下:
(1).readerIdleTime:为读超时间(即测试端一定时间内未接收到被测试端消息);
(2).writerIdleTime:为写超时间(即测试端一定时间内向被测试端发送消息);
(3).allIdeTime:所有类型的超时时间
这个类主要也是一个ChannelHandler,也需要被载入到ChannelPipeline中,加入我们在服务端的ChannelInitializer中加入如下的代码:
我们在channel链中加入了IdleStateHandler,第一个参数是5,单位是秒,意思是:在服务端会每隔5秒来检查一次channelRead方法被调用的情况,如果在5秒内该链上的channelRead方法没有被触发,就会调用userEventTriggered方法。
初步看一下IdleStateHandler源码,先看一下IdleStateHandler中的channelRead方法:
请注意254行代码其实表示该方法只是进行了透传,不做任何的业务逻辑处理,让channelPipel中的下一个Handler处理channelRead方法,但是记录了一下这里的调用时间。
再看看channelActive方法:
这里有个initialize的方法,这是IdleStateHandler的精髓,接着探究:
这边会触发一个Task,ReaderIdleTimeoutTask,这个task的部分源码是这样的:
341行是这样的,用当前时间减去最后一次channelRead方法调用的时间,假如这个结果是6s,说明最后一次调用channelRead已经是6s之前的事情了,你设置的是5s,那么nextDelay则为-1,说明超时了,那么354行则会触发userEventTriggered方法:
没有超时,则不触发userEventTriggered方法
初略地看下就是这么多,这就是IdleStateHandler的原理了。
简而言之:
IdleStateHandler这个类会根据你设置的超时参数的类型和值,循环去检测channelRead和write方法多久没有被调用了,如果这个时间超过了你设置的值,那么就会触发对应的事件,read触发read,write触发write,all触发all
如果超时了,则会调用userEventTriggered方法,且会告诉你超时的类型
如果没有超时,则会循环定时检测,除非你将IdleStateHandler移除Pipeline
- Netty心跳检测篇之IdleStateHandler
- Netty 之 Netty心跳之IdleStateHandler
- 一起学Netty(十一)之 Netty心跳之IdleStateHandler
- 一起学Netty(十一)之 Netty心跳之IdleStateHandler
- 一起学Netty(十一)之 Netty心跳之IdleStateHandler
- Netty心跳检测篇之简单实例
- netty中使用IdleStateHandler来发起心跳
- netty中使用IdleStateHandler来发起心跳
- netty 心跳与IdleStateHandler与断线重连
- Netty学习(五)—IdleStateHandler心跳机制
- netty 心跳检测
- Netty心跳检测
- java网络编程之Netty实战心跳检测(八)
- netty的心跳检测实现
- 基于netty的心跳检测
- 基于netty的心跳检测
- netty的心跳检测实现
- 基于netty的心跳检测
- C++头文件和源文件的关系以及makefile文件
- 前缀式的计算
- MySQL——根据某时间点查询其前后数据记录并正序输出到TXT文件
- Algorithms(二)Maximum Subarray
- std:map与迭代器简析
- Netty心跳检测篇之IdleStateHandler
- tensorflow使用中遇到的问题
- Spring_5 声明式事物
- Meclipse设置默认编码为UTF-8
- 页面布局:三栏布局,假设高度已知,左右宽度固定为300px,中间自适应。
- 解决方案集X1
- TF-IDF 加权及其应用
- android 64位机子兼容32位so包的操作
- java21个知识点重点