netty心跳检测机制
既然是网络通信那么心跳检测肯定是离不开的,netty心跳检测分为读、写、全局
bootstrap.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
// 注册一个心跳检测机制, 3秒未发生读事件进行触发,4秒为发生写事件进行触发,7秒未发生读写事件进行触发
ch.pipeline().addLast(new IdleStateHandler(3, 4, 7, TimeUnit.SECONDS));
// 发生心跳检测随即交个下一个handler.userEventTriggered(ctx, event)来处理
ch.pipeline().addLast(new HBServerChannelHandler());
}
}); /********************************IdleStateHandler********************************/ public IdleStateHandler(long readerIdleTime, long writerIdleTime, long allIdleTime, TimeUnit unit) public void channelActive(ChannelHandlerContext ctx) throws Exception {
// channel处于active状态随即进行初始化
initialize(ctx);
super.channelActive(ctx);
} private void initialize(ChannelHandlerContext ctx) {
switch (state) {
case 1:
case 2:
return;
} state = 1;
initOutputChanged(ctx);
// 根据设置的相关时间 创建不同的定时任务并提交到EventLoop
lastReadTime = lastWriteTime = ticksInNanos();
if (readerIdleTimeNanos > 0) {
readerIdleTimeout = schedule(ctx, new ReaderIdleTimeoutTask(ctx),
readerIdleTimeNanos, TimeUnit.NANOSECONDS);
}
if (writerIdleTimeNanos > 0) {
writerIdleTimeout = schedule(ctx, new WriterIdleTimeoutTask(ctx),
writerIdleTimeNanos, TimeUnit.NANOSECONDS);
}
if (allIdleTimeNanos > 0) {
allIdleTimeout = schedule(ctx, new AllIdleTimeoutTask(ctx),
allIdleTimeNanos, TimeUnit.NANOSECONDS);
}
} /********************************ReaderIdleTimeoutTask********************************/
private final class ReaderIdleTimeoutTask extends AbstractIdleTask { ReaderIdleTimeoutTask(ChannelHandlerContext ctx) {
super(ctx);
} @Override
protected void run(ChannelHandlerContext ctx) {
// 计算出下次心跳检测剩余的时间,因为定时任务可能被提前执行
// 在之前分析EventLoop.run()的runAllTasks(),会把定时任务队列中未超过执行期限的定时任务添加到当前普通任务中来
long nextDelay = readerIdleTimeNanos;
if (!reading) {
// ticksInNanos() - lastReadTime = 当前离上次读事件发生的间隔
nextDelay -= ticksInNanos() - lastReadTime;
} if (nextDelay <= 0) { // 小于0 表示已经超过设定的心跳检测时长 // 心跳检测是不断重复检测,重新发起一个心跳检测任务
readerIdleTimeout = schedule(ctx, this, readerIdleTimeNanos, TimeUnit.NANOSECONDS); boolean first = firstReaderIdleEvent;
firstReaderIdleEvent = false; try {
// 将当前心跳检测事件向后传递,随即交给下一个handler执行,handler.fireUserEventTriggered(context, event)
IdleStateEvent event = newIdleStateEvent(IdleState.READER_IDLE, first);
channelIdle(ctx, event);
} catch (Throwable t) {
ctx.fireExceptionCaught(t);
}
} else {
// 还没有超出心跳检测的时间范围,则将剩余的时间当成下一次定时任务执行的时间
readerIdleTimeout = schedule(ctx, this, nextDelay, TimeUnit.NANOSECONDS);
}
}
}
可以看出netty的心跳检测就是通过IdleStateHandler完成的,解释下IdleStateHandler构造方法的几个参数
readerIdleTime: 读事件的心跳检测时长
writerIdleTime:写事件的心跳检测时长
allIdleTime: 既包含读也包含写的心跳检测时长
发生心跳检测后,需要对对应的事件处理, 需要我们自己定义一个handler然后实现userEventTriggered(context, event)方法用来接收事件
netty心跳检测机制的更多相关文章
- 面试官:Netty心跳检测机制是什么,怎么自定义检测间隔时间?
哈喽!大家好,我是小奇,一位热爱分享的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新 一.前言 书接上回,昨天在地里干了一天的 ...
- Netty — 心跳检测和断线重连
一.前言 由于在通信层的网络连接的不可靠性,比如:网络闪断,网络抖动等,经常会出现连接断开.这样对于使用长连接的应用而言,当突然高流量冲击势必会造成进行网络连接,从而产生网络堵塞,应用响应速度下降,延 ...
- Netty 中的心跳检测机制
心跳检测一般存在于建立长连接 或者 需要保活的场景. 心跳的使用场景 长连接的应用场景非常的广泛,比如监控系统,IM系统,即时报价系统,推送服务等等.像这些场景都是比较注重实时性,如果每次发送数据都要 ...
- javascript websocket 心跳检测机制介绍
====测试代码: ==index.html <!DOCTYPE html> <html lang="en"> <head> <meta ...
- 分析dubbo心跳检测机制
目的: 维持provider和consumer之间的长连接 实现: dubbo心跳时间heartbeat默认是60s,超过heartbeat时间没有收到消息,就发送心跳消息(provider,cons ...
- Netty 读写检测机制(心跳)
一.创建服务端 1.MyServer 类 public class MyServer { public static void main(String[] args) throws Exception ...
- 聊聊心跳机制及netty心跳实现
我们在使用netty的时候会使用一个参数,ChannelOption.SO_KEEPALIVE为true, 设置好了之后再Linux系统才会对keepalive生效,但是linux里边需要配置几个参数 ...
- 【Netty】利用Netty实现心跳检测和重连机制
一.前言 心跳机制是定时发送一个自定义的结构体(心跳包),让对方知道自己还活着,以确保连接的有效性的机制. 我们用到的很多框架都用到了心跳检测,比如服务注册到 Eureka Server 之后会维 ...
- 连接管理 与 Netty 心跳机制
一.前言 踏踏实实,动手去做,talk is cheap, show me the code.先介绍下基础知识,然后做个心跳机制的Demo. 二.连接 长连接:在整个通讯过程,客户端和服务端只用一个S ...
随机推荐
- XSS漏洞防御之HttpOnly
WWW服务依赖于Http协议实现,Http是无状态的协议,所以为了在各个会话之间传递信息,就需要使用Cookie来标记访问者的状态,以便服务器端识别用户信息. Cookie分为内存Cookie和硬盘C ...
- jq中$(function(){})和js中window.onload区别
先看下执行代码: $(function(){ console.log("jq");}) $(function(){ console.log("jq1") ...
- vue项目中扫码枪收款
扫码枪会将扫到的数据带入到获取焦点的输入框中,并且触发输入框的enter回车事件 1.页面上要有一个输入框,并且是获取焦点状态,当然它是隐藏的看不到,我是把宽高设置为0,然后加上回车事件. ...
- C#获取引用组件的版本信息
/// <summary> /// 当前目录下文件版本 /// </summary> public void FilesVersion ...
- 【置顶】Trotyl's OI tree
\(\rm thx\):@\(\rm UntilMadow\) ! \(\color{Green}{\rm Pupil}\) :只会一点点 \(\color{blue}{\text{Expert}}\ ...
- 排序算法-Java实现快速排序算法
- solidity 合约单元测试报错 org.fisco.bcos.web3j.protocol.exceptions.TransactionException: Transaction has failed with status: 0x16. Gas used: 1163650. (not-enough gas?)
org.fisco.bcos.web3j.protocol.exceptions.TransactionException: Transaction has failed with status: 0 ...
- li = [11,22,33,44,55,66,77,88,99]分类
方法一: li = [11,22,33,44,55,66,77,88,99]s = []m = []for i in li: if i <= 55: s.append(i) else: m.ap ...
- MBR分区表为什么最大只能识别2TB硬盘容量
1. 前言 最近公司的服务器硬盘坏了,需要换一个新的硬盘,容量是2TB,用的fdisk进行分区,期间搜索分区工具,看到了关于MBR(Master Boot Record)与GPT(GUID parti ...
- 设置非root账号不用sudo直接执行docker命令
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...