一种基于Web的实时消息定向推送方法

文档序号:9600930阅读:734来源:国知局
一种基于Web的实时消息定向推送方法
【技术领域】
[0001] 本发明涉及属于一种B/S(Browser/Server浏览器/服务器)架构中的实时消息 定向推送方法,特别是应用于船舶交通管理系统的船舶实时动态监控的一种基于Web的实 时消息定向推送方法。
【背景技术】
[0002] 在船舶交通领域,关注的重点永远是船舶本身,尤其是当前在港船舶的相关信息, 如船舶当前状态,船舶实时方位,船舶实时载重吃水等船舶本身信息以及航行计划,靠泊计 划等相关信息,这些信息都属于动态信息,随时会发生变化,因此需要一种可以实时推送消 息的机制。
[0003] 目前国内海事局所用VTS系统中对于实时数据的处理与展现都是基于传统的C/ S(Client/Server客户端/服务器)架构,存在着适用面窄、维护成本高、平台依赖等不足。 而B/S架构由于其本身的局限性,服务器端只能被动接受浏览器端发出的请求并反馈相应 内容。换而言之,服务器端无法主动地向浏览器端推送消息。而现有的模拟服务器端推送 的方法主要有轮询、Stream方式以及基于HTML5的WebSocket。
[0004] 轮询实现方式为浏览器端定时向服务器端请求最新的数据,存在资源浪费、服务 器压力大的缺点;Stream方式则是在浏览器的HTML页面里面嵌入一个隐藏的的Iframe, 并设置它的SRC属性为Streaming模式,通过这个Iframe进行请求连接。服务器在收到 请求后一直保持该连接,在执行过程中不关闭次连接。但是这种方式将会长时间占用服务 器链接、大量长时间占用服务器资源,并且浏览器端一直处于加载状态,影响用户体验;Web Socket方式则存在浏览器支持问题,现在并不是所有的主流浏览器都支持HTML5的。

【发明内容】

[0005] 发明目的:本发明所要解决的技术问题是针对现有技术的不足,提供一种基于 Web的实时消息定向推送方法。
[0006] 为了解决上述技术问题,本发明公开了一种基于Web的实时消息定向推送方法, 包括步骤如下:
[0007] 步骤1,在服务器端建立一套消息注册订阅机制。主要包含消息接收模块、消息分 发模块以及消息处理模块。
[0008] 步骤2,浏览器端发送请求到服务器端注册并订阅所需要的消息类型。
[0009] 步骤3,服务器端定向推送消息至浏览器端。
[0010] 本发明中,所述消息接收模块,包括一张静态哈希表,用于储存消息ID与消息类 的映射;消息接收模块接收从服务器发送来的二进制消息,根据消息ID以及Java反射机制 将二进制流转换成Java消息对象并调用消息分发模块;
[0011] 所述消息分发模块,包括静态哈希表T1和静态哈希表T2,静态哈希表T1用于存储 线程ID与其对应公共缓存区、线程锁等数据的映射,静态哈希表T2存储了消息类型与订阅 此类消息的线程ID的映射;消息分发模块将接收到的消息根据类型的不同,从静态哈希表 2获取到订阅此消息的所有线程ID,再根据线程ID从静态哈希表T1获取线程消息缓存,将 消息存入到所有订阅此类消息的线程公共缓存区内,并通过线程锁唤醒线程来接收并处理 公共缓存区中的消息;
[0012] 所述消息处理模块用于将消息对象进行二次缓存用以消息的优化处理并调用消 息。
[0013] 本发明中,步骤2包括:
[0014] 步骤21,浏览器端发送Ajax请求至服务器端,请求线程开始等待。
[0015] 步骤22,服务器端收到消息后经过消息处理器处理,唤醒线程读取公共缓存区。
[0016] 本发明中,步骤22包括:
[0017] 服务器判断请求参数是否含有线程ID,如果不含线程ID,则生成新的线程ID,分 配公共缓存区、线程锁,使用此线程ID在消息分发模块注册并订阅相应类型的消息;
[0018] 服务器根据线程ID查看公共缓存区是否已有缓存消息,如果有,则直接进入步骤 3,否则继续;
[0019] 服务器利用Java线程机制等待线程锁,直到消息接收模块收到新的消息并调用 消息分发模块唤醒此线程。
[0020] 本发明中,步骤3包括:
[0021] 步骤31,线程被唤醒后从公共缓存区读取消息,处理消息并将其放入私有缓存区。
[0022] 步骤32,等待一小段时间(例如50ms)之后再次尝试从公共缓存区读取消息,如果 有新消息则继续处理新消息并将其放入私有缓存区。
[0023] 步骤33,重复步骤2直到累积到一定数量报文(可配置)或者没有新消息,将私有 缓存区的消息推送至浏览器端。
[0024] 步骤34,浏览器收到数据后进行处理,处理完成后重新发送Ajax请求至服务器继 续订阅消息。
[0025] 本发明在卸载页面时,发送Ajax请求清空对应的公共及私有缓存区。
[0026] 本发明的目的在于提供一种基于B/S架构的实时消息推送方法,其实质是解决B/ S架构软件系统中浏览器端与服务器端信息传输不对等,服务器端只能接收处理浏览器端 的Http请求而无法主动向浏览器发送请求的技术问题以及对于短时间大批量消息的处理 优化。为服务器提送主动定向推送提供技术支持。
[0027] 本发明采用B/S(浏览器-服务器)架构,在服务器端增加一套注册订阅机制以及 消息二次缓存机制,每一个浏览器都将注册并订阅自己所需要的消息类型,而服务器在收 到其他数据源发来的消息后根据消息类型及其订阅情况将消息处理后定向推送到浏览器 端。传输机制则使用改进后的长轮询机制,大大降低了服务器压力,合理利用系统资源。
[0028] 本发明采用基于Web的实时消息定向推送方法,不仅能够满足多用户并发场景下 的实时数据定向推送需求,而且能够有效地提高服务器、网络带宽等资源的利用率。在浏览 器端做到无刷新,不闪屏的良好用户体验。具有部署简便、支持多用户场景、用户体验好等 优点。
【附图说明】
[0029] 下面结合附图和【具体实施方式】对本发明做更进一步的具体说明,本发明的上述和 /或其他方面的优点将会变得更加清楚。
[0030] 图1为本发明实时消息定向推送方法总流程图;
[0031] 图2为本发明轮询流程示意图。
【具体实施方式】
[0032] 本方法使用改进后的长轮询机制,具体流程见图2,浏览器每次发送Ajax请求至 服务器端。服务器端利用Java线程机制阻塞此线程直到有新消息到达或者等待超时。不 论有新消息到达抑或等待超时,返回浏览器端并断开连接。浏览器端处理数据后重复以上 过程。
[0033] 所有消息均继承消息虚类VTMSMessage,需要实现其虚方法processMsg。具体定 义如下:
[0036] 消息缓存定义如下:
[0037]
[0038] 后台注册订阅机制包括以下重要模块:
[0039] 1)消息接收模块(下称Ml),内含一张静态哈希表(Map〈Integer,Class〈? >>), 负责储存消息ID与消息类的映射。此模块负责接
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1