首页 > 其他分享 >【心跳的两种模式】

【心跳的两种模式】

时间:2024-08-07 22:56:56浏览次数:17  
标签:两种 ctx private IDLE 模式 心跳 IdleStateHandler public

目录

在这里插入图片描述
欢迎关注微信公众号:数据科学与艺术

心跳的两种模式是纯净的IdleStateHandler和纯净的IdleStateHandler+次数计时策略。

  1. 纯净的IdleStateHandler模式:使用参数设置的间隔空闲时间,如果超过这个时间,就认为心跳失败。
public class HeartbeatHandler extends ChannelInboundHandlerAdapter {

    private static final int IDLE_TIME = 10; // 设置空闲时间为10秒

    private IdleStateHandler idleStateHandler;

    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        super.channelActive(ctx);
        ctx.pipeline().addLast(idleStateHandler = new IdleStateHandler(0, 0, IDLE_TIME));
    }

    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        if (evt instanceof IdleStateEvent) {
            IdleStateEvent idleStateEvent = (IdleStateEvent) evt;
            if (idleStateEvent.state() == IdleState.READER_IDLE) {
                // 心跳失败处理
                ctx.close();
            } else if (idleStateEvent.state() == IdleState.WRITER_IDLE) {
                // 发送心跳消息
                ctx.channel().writeAndFlush("heartbeat");
            }
        }
    }

}
 
  1. 纯净的IdleStateHandler+次数计时策略模式:在一定时间内连续几次心跳失败才认为连接断开。这种模式考虑了心跳事件之间的时间间隔,如果间隔时间过长,就不会计算为心跳失败。
public class HeartbeatHandler extends ChannelInboundHandlerAdapter {

    private static final int IDLE_TIME = 10; // 设置空闲时间为10秒
    private static final int MAX_FAILURE_TIMES = 3; // 设置最大心跳失败次数为3次
    private static final int MAX_FAILURE_INTERVAL = 5; // 设置心跳失败次数间隔为5秒

    private IdleStateHandler idleStateHandler;
    private int failureTimes;
    private ScheduledExecutorService executorService;

    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        super.channelActive(ctx);
        ctx.pipeline().addLast(idleStateHandler = new IdleStateHandler(0, 0, IDLE_TIME));
        failureTimes = 0;
        executorService = Executors.newSingleThreadScheduledExecutor();
    }

    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        if (evt instanceof IdleStateEvent) {
            IdleStateEvent idleStateEvent = (IdleStateEvent) evt;
            if (idleStateEvent.state() == IdleState.READER_IDLE || idleStateEvent.state() == IdleState.WRITER_IDLE) {
                failureTimes++;
                if (failureTimes >= MAX_FAILURE_TIMES) {
                    // 心跳失败次数超过最大次数,断开连接
                    ctx.close();
                } else {
                    // 重新计时
                    executorService.schedule(() -> {
                        failureTimes = 0;
                    }, MAX_FAILURE_INTERVAL, TimeUnit.SECONDS);
                }
            }
        }
    }

    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        super.channelInactive(ctx);
        executorService.shutdown();
    }

}
 

这两种模式都是通过空闲检查Handler来实现的,可以根据具体需求选择适合的模式来建立心跳机制。
基于Netty的实现,使用这两种模式之一可以建立心跳机制,保持与服务器的连接。

标签:两种,ctx,private,IDLE,模式,心跳,IdleStateHandler,public
From: https://blog.csdn.net/qq_31532979/article/details/140950415

相关文章

  • python,怎么用工厂模式设计代码?
    工厂模式打造工厂模式,需要抽象工厂和具体工厂。怎么理解?抽象工厂就是接口的定义,但不负责具体的实现。而具体工厂则需要负责定义的接口的实现。就好比你爸爸让你上街时带一瓶酱油,而具体买什么牌子的由你决定。”你爸爸让带一瓶酱油“就是接口的定义函数,这个函数只负责定义”要求“......
  • 防盗、防泄露、防篡改,我们把 ZooKeeper 的这种认证模式玩明白了
    作者:子葵你的ZooKeeper安全吗?在当下网络安全事件频发的背景下,安全防护的构建成为日常开发与运维工作中的重中之重。ZooKeeper存储着系统敏感实例信息与配置数据,但传统的使用方式并未为ZooKeeper配备强制身份验证机制,从而使得其内部数据面临暴露在网络空间中的风险。稍有不......
  • Java的单例模式其实跟C的面向过程没什么区别
    这个我觉得倒也没有那么好笑,Java里面Singleton用的的确是有点多得离谱了,实际上把一个Singleton类的所有成员(包括字段和方法)都换成静态也没有什么不可以的,用Singleton主要是这样几个优点:1、Singleton类可以用接口和继承,static不行2、因此,Singleton类稍微保留了一点多态能力,例如可以......
  • AT、TCC、SAGA 和 XA 事务模式
    分布式事务是指跨多个服务或数据库的事务,这些事务需要在各个参与者之间保持一致性。以下是四种常见的分布式事务模式:AT(AutomaticTransaction)、TCC(Try-Confirm/Cancel)、SAGA和XA事务模式。1.AT(AutomaticTransaction)简介:AT是由阿里巴巴提出的分布式事务解决方案,属于......
  • 推三返一模式商城小程序开发
    “**推三返一模式商城小程序开发**”,推三返一模式是一种常见的营销策略,即用户推荐三位新用户完成购买后,可以获得一定的奖励或返现。在小程序中实现这种模式,可以极大地提升用户的参与度和商城的口碑传播。开发步骤建议:需求分析与规划:明确“推三返一”的具体规则,如返现......
  • 预装Windows 11系统的新电脑怎么跳过联网验机?这两种方法可以搞定
    温馨提示:跳过windows11联网的方法不一定适用于所有电脑,且过程中可能会出现卡顿的现象,请做好心理准备。验机本就是个人意愿,非硬性要求,不喜欢折腾的就别弄,有问题务必第一时间找售后。不少笔记本新机都预装了Windows11系统,而初次开机的正常流程下,Windows11系统(家庭版......
  • Python中有 spawn、fork、forkserver 三种创建子进程的模式
    spawn可以绕开GIL限制frok后重新启动python解释器避免共享父进程不安全的资源出现竞争的条件主动传入进程对象run方法所需的资源,子进程会拷贝一份传递进来的资源速度比fork或者forkserver模式慢1.创建新进程:spawn命令允许在当前进程的环境中创建一个新进程。这个......
  • 【设计模式#1】Facade设计模式(外观设计模式)的简单理解
    最近接手了一个需要重构的老项目,里面大量使用了Facade设计模式来整合各个子系统的功能,故简单梳理学习一下该设计模式的概念。外观模式(FacadePattern)是一种结构型设计模式,它通过为复杂子系统提供一个简单的接口,从而简化客户端与子系统的交互。为了更好地理解这一模式,我们可以举一......
  • 深入解析:23种软件设计模式详解及其分类(创建型、结构型、行为型)附代码示例DEMO
    目录引言一、创建型模式1.简单工厂模式(SimpleFactoryPattern)2.抽象工厂模式(AbstractFactoryPattern)3.单例模式(SingletonPattern)4.建造者模式(BuilderPattern)5.原型模式(PrototypePattern)二、结构型模式1.适配器模式(AdapterPattern)2.桥接模式(BridgePatt......
  • 高并发下的分布式缓存 | Cache-Aside缓存模式
    Cache-aside模式的缓存操作Cache-aside模式,也叫旁路缓存模式,是一种常见的缓存使用方式。在这个模式下,应用程序可能同时需要同缓存和数据库进行数据交互,而缓存和数据库之间是没有直接联系的。这意味着,应用程序代码要负责处理数据的获取和存储,一些应用程序使用“Read-Thr......