Netty 心跳

本文介绍了在应用中使用Nettyx的IdledHeartBeater来增强网络连接稳定性,特别是ReadIdleHeartBeater、WriteIdleHeartBeater和AllIdleHeartBeater三种不同类型的闲置心跳检测机制。此外,还提到了如何在常规情况下使用定时任务替代全程心跳功能。
摘要由CSDN通过智能技术生成

概要

  一般而言, 个人极其建议在应用中添加业务心跳, 如果将应用的稳定性单单寄托在tcp keepalive, 当出现类似拔网线这种操作时, 应用将无法及时感知.
当然这区分服务端和客户端, 两者策略不同, 具体场景具体对待.

正文开始, 先引入Nettyx的依赖

请从maven中央仓获取{lastest.version},最新版本号
<dependency>
    <groupId>io.github.fbbzl</groupId>
    <artifactId>nettyx</artifactId>
    <version>{lastest.version}</version>
</dependency>

IdledHeartBeater

  Nettyx提供了abstract IdledHeartBeater, 为了不占用带宽, 它只会在闲置的时候进行心跳, 既然是在闲置时心跳.
那么很自然的有三个实现类 :
ReadIdleHeartBeater: 读闲置时心跳, 只会在一定时间内没有read到数据才会开始心跳
WriteIdleHeartBeater: 写闲置时心跳, 只会在一定时间内没有write数据才会开始心跳
AllIdleHeartBeater: 读写闲置时心跳, 揉和版, 只会在一定时间内既没有read也没有write时开始心跳

使用很简单

    private ChannelInitializer<NioSocketChannel> channelInitializer(SocketAddress address) {
        return new ChannelInitializer<NioSocketChannel>() {
            @Override
            protected void initChannel(NioSocketChannel channel) {
                channel.pipeline()
			            // ReadIdleHeartBeater有自己的读闲置计数, 和pipeline中其他的读闲置handler不冲突
  		                // 例如,如果同时设置了inboundadvice 或者idlestatehandler
  		                // 他们的读闲置时间设置并不会影响到ReadIdleHeartBeater的闲置时间, 
  		                // ReadIdleHeartBeater的读闲置只会用来发送心跳消息, 也不会在pipeline中传播
                       .addLast(new ReadIdleHeartBeater(2, ctx -> ctx.write("heart beat msg")))
                       // in  out
                       // ▼   ▲  remove start and end flag
                       .addLast(new StartEndFlagFrameCodec(1024 * 1024, false,
                                                           Unpooled.wrappedBuffer(new byte[]{(byte) 0x7e})))
                       .addLast(new EscapeCodec(EscapeMap.mapHex("7e", "7d5e")))
                       .addLast(new UserCodec())
                       // ▼   ▲  deal control character and recover application data
                       .addLast(new LoggerHandler.InboundLogger(log, LoggerHandler.Sl4jLevel.ERROR);
            }
        };
    }

  至此我们完成了 闲置发送心跳 的功能
???什么你跟我说常规的心跳器???如果你并不想在闲置时发送心跳, 而是应用启动即全程开始心跳, 那么我懒得封装, 一个定时任务就足矣可以搞定了, 当然了, 要注意管理好这个定时器的生命周期,以及客户端/服务端实现之间的差别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值