关闭

Netty 之 Netty心跳之IdleStateHandler

8776人阅读 评论(2) 收藏 举报
分类:

Netty提供了对心跳机制的天然支持,心跳可以检测远程端是否存活,或者活跃


今天我们就一起初识一下Netty4的心跳机制


Netty4.0提供了一个类,名为IdleStateHandler,这个类可以对三种类型的心跳检测


这个类的构造参数是这样的:

前三个的参数解释如下:

1)readerIdleTime:为读超时时间(即测试端一定时间内未接受到被测试端消息)

2)writerIdleTime:为写超时时间(即测试端一定时间内向被测试端发送消息)

3)allIdleTime:所有类型的超时时间


这个类主要也是一个ChannelHandler,也需要被载入到ChannelPipeline中,加入我们在服务器端的ChannelInitializer中加入如下的代码:



我们在channel链中加入了IdleSateHandler,第一个参数是5,单位是秒,那么这样做的意思就是:在服务器端会每隔5秒来检查一下channelRead方法被调用的情况,如果在5秒内该链上的channelRead方法都没有被触发,就会调用userEventTriggered方法:



初步地看下IdleStateHandler源码,先看下IdleStateHandler中的channelRead方法:


请注意254行代码其实表示该方法只是进行了透传,不做任何业务逻辑处理,让channelPipe中的下一个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

1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

一起学Netty(十一)之 Netty心跳之IdleStateHandler

Netty提供了对心跳机制的天然支持,心跳可以检测远程端是否存活,或者活跃 今天我们就一起初识一下Netty4的心跳机制 Netty4.0提供了一个类,名为Idle...
  • z69183787
  • z69183787
  • 2016-10-31 11:02
  • 1544

Netty心跳检测篇之IdleStateHandler

Netty提供了对心跳机制的天然支持,心跳检测可以检测远程端是否存活,或者活跃。 今天,我们就一起初识一下Netty4的心跳机制。 Netty4.0提供了一个类,名为IdleStateHandle...
  • Crazer_cy
  • Crazer_cy
  • 2017-09-17 14:35
  • 201

基于netty的心跳检测

这两天由于要给android系统的设备写一个心跳功能,所以在这里写一个基于netty的心跳检测功能。 实现的功能: 1.客户端网络空闲5秒没有进行写操作是,进行发送一次ping心跳给服务端; 2.客户...
  • asd13141718
  • asd13141718
  • 2015-03-11 20:45
  • 4335

netty入门学习(5)-超时处理

服务端和客户端同时增加如下代码: Timer trigger=new HashedWheelTimer(); final ChannelHandler timeOutHandler=new ...
  • qian_348840260
  • qian_348840260
  • 2013-05-29 18:29
  • 8906

一起学Netty(十一)之 Netty心跳之IdleStateHandler

Netty提供了对心跳机制的天然支持,心跳可以检测远程端是否存活,或者活跃 今天我们就一起初识一下Netty4的心跳机制 Netty4.0提供了一个类,名为IdleStateHandler,这...
  • linuu
  • linuu
  • 2016-05-14 10:14
  • 4206

一起学Netty(十四)之 Netty生产级的心跳和重连机制

sigh,这这篇博客的时候老脸还是红了一下,应该算是剽窃吧,看到别人写的代码有点无地之容,好在文章的标题是“一起学”,而不是开涛大神的“跟我学”系列的文章 最近工作比较忙,但闲暇之余还是看了阿里的...
  • linuu
  • linuu
  • 2016-05-27 09:46
  • 20083

Netty学习(五)—IdleStateHandler心跳机制

Netty学习(五)—IdleStateHandler心跳检测 Netty的IdleStateHandler心跳机制主要是用来检测远端是否存活,如果不存活或活跃则对空闲Socket连接进行处理避免...
  • u013967175
  • u013967175
  • 2017-11-21 13:53
  • 199

netty中使用IdleStateHandler来发起心跳

ps :这个写在client 端即可,不需要加在server端 网络连接中,处理Idle事件是很常见的,一般情况下,客户端与服务端在指定时间内没有任何读写请求,就会...
  • AlbertFly
  • AlbertFly
  • 2016-08-11 14:27
  • 2669

Netty5.0 实现心跳包

这是一个netty自带的echo案例,添加了心跳包的设置而已,关键代码如下: /* * Copyright 2012 The Netty Project * * The Netty Proj...
  • caiwenfeng_for_23
  • caiwenfeng_for_23
  • 2015-04-21 23:59
  • 16657

浅析 Netty 实现心跳机制与断线重连

基础 何为心跳 顾名思义, 所谓 心跳, 即在 TCP 长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, 通知对方自己还在线, 以确保 TCP 连接的有效性. 为什么需要心...
  • z69183787
  • z69183787
  • 2016-09-26 16:41
  • 6893
    个人资料
    • 访问:9050185次
    • 积分:75764
    • 等级:
    • 排名:第25名
    • 原创:262篇
    • 转载:2812篇
    • 译文:3篇
    • 评论:786条
    文章分类
    最新评论