记录一下上个月实现的简单版的一个通信中心推送两个通信中心的过程。

上个月我的通信中心出现了,可以入库mysql5.7,但是不能推送给客户第三方API的情况,我就决定把通信中心一分为三,一个通信中心专门只接收然后转发信息给另外两个通信中心,

另外两个通信中心是这样安排的,一个专门解析国家水文协议及入库操作,另一个通信中心解析水文协议完后就推送给第三方API。说明一下我的程序是基于netty通信框架的。

然后就出现异常:io.netty.util.IllegalReferenceCountException: refCnt: 0

经过网络查询知道原因是:

这是因为Netty引用计数器的原因,自从Netty 4开始,对象的生命周期由它们的引用计数(reference counts)管理,而不是由垃圾收集器(garbage collector)管理了。ByteBuf是最值得注意的,它使用了引用计数来改进分配内存和释放内存的性能。

在我们创建ByteBuf对象后,它的引用计数是1,当你释放(release)引用计数对象时,它的引用计数减1,如果引用计数为0,这个引用计数对象会被释放(deallocate),并返回对象池。

主要原因就是我第一个专门中转的通信中心收到RTU设备的信息后要转发给两个通信中心,第一次转发的时候是没有问题的,这个时候ctx.write 等一系列方法调用了ByteBuf的release方法,将其引用计数减为0了,当第二次转发的时候就报异常了。

解决的方法:

.retain();// 我们可以调用ByteBuf.retain()将引用计数加1

.duplicate();//复制当前对象,复制后的对象与前对象共享缓冲区,且维护自己的独立索引

接下就是一个通信中心推送(转发)另外两个通信中心的思路:

由于业务就是要处理RTU设备发送过来的信息再加上推送给第三方API,如果设备没有连接上来,三个通信中心也得自己互连互通。

思路如下:

第一部分:自定义自己的包头不能和水文的7E7E一样就可以了。

第二部分:安排两个字节指示剩下报文的长度。

第三部分:两个字节水文协议报文长度。

第四部分:水文协议报文内容(如果第三部分长度大于零)。

第五部分:通信中心之间的心跳信息(如果第三部分长度等于零)。

经过排查发现我用的第三方推送程序挂一两天后就是不推送了,替换另的推送程序。经过一个月了,程序已经稳定。

原文地址:https://www.cnblogs.com/yebinghuai/p/12037906.html

时间: 2024-12-16 22:13:17

记录一下上个月实现的简单版的一个通信中心推送两个通信中心的过程。的相关文章

开发版速达微信订单推送

在开发如何进行微信推送订单信息之前,我们需要先了解下微信的一些规定和技术: 公众平台服务号.订阅号.企业号的相关说明 1.订阅号:主要偏于为用户传达资讯(类似报纸杂志),认证前后都是每天只可以群发一条消息: 2.服务号:主要偏于服务交互(类似银行,114,提供服务查询),认证前后都是每个月可群发4条消息: 3.企业号:主要用于公司内部通讯使用,需要先验证身份才可以关注成功企业号. 温馨提示: 1)如果想简单的发送消息,达到宣传效果,建议可选择订阅号: 2)如果想用公众号获得更多的功能,例如开通微

利用Hessian10分钟配置出一个简单的跨Web服务消息推送

笔者,之前对Web跨服务推送数据一无所知,今天研究了一下.其实有些事物,在不理解的时候完全觉得好似天外来物.但了解一点点之后,又会觉得十分有趣.每天闲扯一下很开心,下面一个简单的实例10分钟配置出跨Web服务的消息推送.一.被调用端web.xml配置 <!--HelloHessian --> <servlet> <servlet-name>HelloHessian</servlet-name> <servlet-class>com.caucho.

简单、高效、易用的全平台(Windows/Linux/ARM/Android/iOS)web实现RTMP推送组件EasyRTMP-Android BUS传递消息过程介绍

背景分析 RTMP是Real Time Messaging Protocol(实时消息传输协议)的首字母缩写,该协议基于TCP,是一个协议族,包括RTMP基本协议及RTMP/RTMPS/RTMPE等多种变种.RTMP是一种设计用来进行实时数据通信的网络下ieyi,主要用来在Flash/AIR平台和支持RTMP协议的流媒体/交互服务器之间进行音视频和数据通信.RTMP推流,就是将直播内容推送到服务器的过程. EasyRTMP-Android BUS传递消息过程 提出问题EasyRTMP-Andro

PhoneGap实现信息推送-基于极光推送(Android版)

极光推送插件安装地址: https://github.com/jpush/jpush-phonegap-plugin 安装插件后,需要在AndroidManifest.xml中配置极光平台申请的App Key: <meta-data android:name="JPUSH_APPKEY" android:value="aca4b37e5c00d477b*****" /> 在JPushPlugin.java文件的22行处有报错,需要把这里修改为你自己的主包

八、网页版消息推送SDK-WebSockets

介绍 由于项目组需求.最近在研究消息推送服务平台.结合业务和使用场景分析最终选择的是 Mosquitto 消息服务器. Mosquitto 服务器的安装.配置.集群搭建 我就不在这多说了.有兴趣的可以看我对 Mosquitto  学习记录的前七篇文章. 今天在这住要介绍网页版 WebSockets 实现消息的推送. 1: 本 SDK 的开发 是基于 eclipse.paha.javaScript 包来实现的. 2: 引入开发需要的JavaScript <script src="https:

Win10 RedStone 2预览版优先向PC推送,手机版稍后

此前win10之家报道过预计微软最快将在本周推送首个Win10 RedStone预览版,在发布新的Win10预览版之前,微软今天提醒Insider检查<反馈中心>中的设置,同时微软还表示新的Win10预览版将首先面向PC推送,手机设备还需要等待几周时间. 微软称目前Win10一周年更新Build 14393已经向消费者推出,已经替代此前的Win10 10586系统,现在将再次在快速通道开启新的预览版测试,就像之前Win10 10586测试开始那样,将首先针对PC设备,Win10 Mobile手

iOS上简单推送通知(Push Notification)的实现

http://blog.csdn.net/daydreamingboy/article/details/7977098 iOS上简单推送通知(Push Notification)的实现 根据这篇很好的教程(http://www.raywenderlich.com/3443/apple-push-notification-services-tutorial-part-12),结合自己的实践,写下一点笔记,仅供参考:) 由于篇幅较长,我列出简单的目录,如下 1) 理解Apple推送通知的机制 2)

Win10 Mobile预览版10586.420开始推送

6月15日消息,今天凌晨微软开始推送Win10 Mobile稳定分支10586.420预览版更新,此前微软推送过上一个更新10586.338,本次10586.420主要面向Release Preview和Production,Production也可以看作是非Insider通道. Windows 10 Mobile稳定分支10586.420没有带来新功能,主要是修复足球投注Bug.提升系统稳定性等. 停留在Win10 Mobile稳定预览版的用户可以到<Windows预览体验>中检查更新,升级

Win10 Mobile一周年更新正式版首批面向解锁版设备推送

9月28日凌晨,在Win10 PC一周年更新正式版推送两周之后,微软正式推出Win10 Mobile一周年更新正式版14393.67,下载包大小是943MB,微软表示本次Win10 Mobile更新面向手机的正常更新渠道. 不过首批Windows 10 Mobile一周年更新正式版系统将推送给所有解锁版或者无锁版的Win10手机设备,如果是bbin定制版的Win10手机收到更新的时间会有所不同.比如无锁版的Lumia950.Lumia950 XL.Lumia650或Lumia1520.Lumia