[Netty] Netty自带的心跳机制 (十五)

news2024/9/23 7:33:04

文章目录

      • 1.IdleStateHandler介绍
      • 2.IdleStateHandler源码解析
      • 3.IdleStateHandler总结

1.IdleStateHandler介绍

Netty服务端心跳机制: IdleStateHandler, 这个类可以对三种类型的心跳检测。

@ChannelHandler.Sharable
public class IdleHandler extends ChannelInboundHandlerAdapter {
    private static final Logger LOG = LoggerFactory.getLogger(IdleHandler.class);

    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object paramObject) throws Exception {
        LOG.info("userEventTriggered");
        if (paramObject instanceof IdleStateEvent) {
            IdleState state = ((IdleStateEvent) paramObject).state();
            if (state == IdleState.ALL_IDLE) {
                //关闭连接
                ctx.channel().close();
            }
        } else {
            super.userEventTriggered(ctx, paramObject);
        }


    }
}

IdleHandler继承了ChannelInboundHandlerAdapter, 载了userEventTriggered方法, 执行了关闭连接的逻辑

在这里插入图片描述

2.IdleStateHandler源码解析

在这里插入图片描述

  • readerIdleTime:为读超时时间(即测试端一定时间内未接受到被测试端消息
  • writerIdleTime:为写超时时间(即测试端一定时间内向被测试端发送消息)
  • allIdleTime:所有类型的超时时间

在这里插入图片描述

这个类是ChannelHandler, 会被加载如ChannelPipeline。

在这里插入图片描述

让channelPipe中的下一个handler处理channelRead方法。

fireChannelRead用法: fireChannelRead表示传递消息至下一个处理器, 因为Pipeline的原因, 有 一个链式的处理队列, 消息为队列的头处理器进入。

比如如果A, B, C处理器, 如果A处理器没有fireChannelRead方法, 那么B, C不会接受到消息。

在这里插入图片描述

IdleStateHandler的精髓。

    private void initialize(ChannelHandlerContext ctx) {
        // Avoid the case where destroy() is called before scheduling timeouts.
        // See: https://github.com/netty/netty/issues/143
        switch (state) {
        case 1:
        case 2:
            return;
        }

        state = 1;
        initOutputChanged(ctx);

        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);
        }
    }

创建时间间隔为readerIdleTime的定时任务。触发了一个Task, ReaderIdleTimeoutTask。

在这里插入图片描述

在这里插入图片描述

用当前时间减去最后一次channelRead方法调用的时间, 假如这个结果是6s, 说明最后一次调用channelRead已经是6s之前的事情了, 设置为5s, 那么nextDelay为-1, 说明超时了。执行③处代码, 触发channelIdle(), 执行fireUserEventTriggered(), 下一个处理器的userEventTriggered()

在这里插入图片描述

自定义的userEventTriggered方法, 在自带的IdleStateHandler处理器, 在心跳检测超时时, 最终会执行下一个handler的userEventTriggered方法来处理。

3.IdleStateHandler总结

IdleStateHandler这个类会根据你设置的超时参数的类型和值, 循环去检测channelRead和write方法多久没有被调用了, 如果时间超过设置的时间的话, 触发对应的事件, channelRead, channelActive, channelIdle方法

  1. 如果超时了, 则会调用userEventTriggered方法, 且会告诉你超时的类型
  2. 如果没有超时, 则会循环定时检测, 除非你将IdleStateHandler移除Pipeline

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/452843.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

redis7详解

Redis基础 文章目录 一、Redis入门概述是什么?能干嘛?主流功能与应用优势 Redis7新特性 二、Redis安装配置Redis7安装步骤Redis7卸载步骤 三、Redis10大数据类型Redis 键(key)1、Redis 字符串(String)2、Reids列表(Lis…

java版本电子招标采购系统源码—企业战略布局下的采购

​ 智慧寻源 多策略、多场景寻源,多种看板让寻源过程全程可监控,根据不同采购场景,采取不同寻源策略, 实现采购寻源线上化管控;同时支持公域和私域寻源。 询价比价 全程线上询比价,信息公开透明&#xff0…

谷歌云 | 内部 HTTP(S) 负载均衡器现在可以在全球范围内访问

【本文由Cloud Ace整理发布,Cloud Ace 是谷歌云全球战略合作伙伴,拥有 300 多名工程师,也是谷歌最高级别合作伙伴,多次获得 Google Cloud 合作伙伴奖。 作为谷歌托管服务商,我们提供谷歌云、谷歌地图、谷歌办公套件、谷…

店铺销售管理系统有哪些用?该如何选?

现在市场竞争越来越激烈,实体店想要吸引更多意向客户,快速提高销量,使用店铺管理系统来智能化管理店铺,已经成为不可或缺的手段。 店铺管理系统能够帮助实体店老板实现店铺销售和库存管理的自动化和集中化,提高门店的销…

Ceph入门到精通-podman 入门实战

目录 podman安装podman制作本地镜像podman(docker)命令回顾podman快速入门 一入编程深似海,从此节操是路人。 最近使用podman,就想着写一篇总结性的笔记,以备后续参考。就如同写代码,不写注释,过了一段时间可能会想这…

【Leetcode】572.另一棵树的子树

另一棵树的子树 题目思路代码 题目 思路 这道题目主要用到判断两个二叉树是否相同 对root为根节点的树进行递归遍历判断 是否存在一颗子树和以subRoot为根节点的树 代码 class Solution {public boolean isSubtree(TreeNode root, TreeNode subRoot) {if(root null){return…

HJL-93/A数字式交流三相电流继电器 导轨安装 约瑟JOSEF

品牌:JOSEF约瑟名称:数字式交流三相电流继电器型号:HJL系列功率消耗:≤5W触点容量:250V/5A额定电压:58、100、110、220V HJL系列 数字式交流三相电流继电器型号: HJL-93/AY数字式交流三相电流继…

收藏~六大网站访客类型及应对方式

收藏!六大网站访客类型及应对方式! 当涉及到与潜在客户接触时,速度是关键。毕竟,当一个潜在客户来到你的网站时,你只有10秒钟的时间来捕捉他们的兴趣。我们把这种主动的方法称为 "扑捉"。它确保你的销售团队…

《百年孤独》

《创世记》之后,首部值得全人类阅读的文学巨著。 — 纽约时报 加西亚 马尔克斯以小说作品创建了一个自己的世界,一个浓缩的宇宙,其中喧嚣纷乱却又生动可信的现实,映射了一篇大陆及其人民的富足与贫困。 — 诺贝尔文学奖颁奖辞 马…

元宇宙数字人直播

数字人直播发展趋势主要有以下几个方面: AI技术:随着人工智能技术的不断发展,数字人直播将更加贴近真实,虚拟人物的表现力和情感交流能力将会得到大幅提升。 元宇宙:元宇宙是一种虚拟现实的空间,数…

如何把视频里的声音提取出来,4种有效方法学起来

在我们日常生活中,可能会有需要从视频文件中提取音频的情况,比如想要将视频中的歌曲或语音内容提取出来,或者电脑上看视频时,总有一些很有意思的BGM,想录下来或者提取出来单独使用,不过有些小伙伴可能不知道…

分布式事务Seata-TCC事务模式

承接上文Seata强一致性事务模式XA的设计理念 通用TCC模式 TCC是二阶段提交协议,Try-Confirm-Cancel(资源预留、确认操作、取消操作),Try是对当前业务资源的检查,如果成功,则Confirm提交,否则C…

8 DWA(一)

8 DWA DMA简介 DMA(Direct Memory Access)直接存储器存取(可以直接访问32内部存储器,包括内存SRAM,Flash) DMA可以提供外设和存储器或者存储器和存储器之间的高速数据传输,无须CPU干预&#x…

NewBing、Andi、Phind、Perplexity 还有国产kuaisou五个AI搜索引擎的介绍和对比

NewBing NewBing是微软推出的新一代AI搜索引擎,它基于OpenAI的下一代大语言模型,比ChatGPT更强大,专门为搜索定制。NewBing可以理解自然语言的问题,生成简洁、准确、有趣的回答,并提供相关的链接和图片。NewBing还可以…

【Happy Eyeballs算法】Happy Eyeballs算法及curl支持--happy-eyeballs-timeout-ms或者代码实现

参考链接 IPV6 && Happy Eyeballs - 腾讯云开发者社区-腾讯云 (tencent.com)https://cloud.tencent.com/developer/article/1561091 Happy Eyeballs算法 Happy Eyeballs是一个应用于网络双栈环境的算法,于2011年被提出。 Happy Eyeballs有两个主要目标&…

C语言实现杨辉三角

目录 1. 发现杨辉三角的规律 2. 实现杨辉三角(无格式控制) 3. 输出带格式控制的杨辉三角 1. 发现杨辉三角的规律 # 每一行的第一个元素是1 ## 每一行的最后一个元素是1 ### 上一行的两个数相加等于下一行的某个数值 2. 实现杨辉三角&#x…

Linux服务器Anaconda版本安装JupyterLab

1、场景 在Linux服务器上安装JupyterLab并可在远程访问! 2、Anaconda版本 本次安装的Anaconda 版本:Anaconda3-5.2.0-Linux-x86_64.sh 下载地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 3、安装 3.1 关闭防火墙 # 查看防火…

使用状态机实现幂等性

文章目录 背景幂等概念适用场景示例代码上述代码状态流转 背景 在某些场景下,可以使用状态机来实现幂等性。将业务流程抽象为一个状态机,定义各个状态之间的转换规则。当收到一个请求时,根据当前状态和请求类型来判断是否允许执行操作&#x…

MySQL高级篇——存储引擎和索引

导航: 【黑马Java笔记踩坑汇总】JavaSEJavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线牛客面试题_java黑马笔记 目录 一、存储引擎 1.1、查看、设置存储引擎的命令 1.2、InnoDB引擎 1.2.1、特点 1.2.2、优势 1.2.3、InnoDB事务的ACID特…

[读书笔记] 从问题和公式角度理解 Diffusion Model

[小全读书笔记] 从问题和公式角度理解 Diffusion Model 1. Diffusion Model的结构1.1 定义与限制1.2 定义与限制的数学体现 2. Diffusion Model的模型训练2.1 似然函数转换成ELBO2.2 拆解ELBO2.3 求解关键: q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1}|x_t,x_0) q(xt−1…