使用CometD技术实现web系统中的主动推送

Posted dvlinker

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用CometD技术实现web系统中的主动推送相关的知识,希望对你有一定的参考价值。

       CometD技术通过Http长轮询(或websocket长链接)方式在服务器与客户端之间构建了一条交互的链路。它们都遵守Bayeux协议,交换的消息是Bayeux message,消息格式是JSON。

1、需求说明

当用户登录后,后台根据用户订阅把最新的信息反推给web客户端,展示在页面上。CometD服务器实现的具体思路如下:当网页客户端登陆后,服务器创建自定义通道(group/user), 然后接收网页客户端的订阅,当后台有数据更新时,后台服务器对数据进行分析,发送给指定的用户。相关示意图如下:

2、CometD实现

2.1、服务端service创建

        CometD服务器继承服务实现自org.Cometd.server.AbstractService。对应的JAVA服务器代码如下:

public class BayeuxService extends AbstractService   
     
    //创建固定的channel
    public BayeuxService(BayeuxServer bayeux) 
        super(bayeux, "cometdServer");
        BayeuxService.bayeux=bayeux;
        addService(LOGIN_CHANNEL, "clientLoginCB");
        addService(TRANSDATA_CHANNEL, "JavaClientTransCB");
    
    
    public void clientLoginCB(ServerSession _session, Message message)//定义回调函数
    
    

以上代码创建2个通道,一个网页客户端的登录通道(LOGIN_CHANNEL),一个是接收后台数据的通道(TRANSDATA_CHANNEL)。  "clientLoginCB"是网页客户端登陆的处理函数, "JavaClientTransCB" 是后台发布数据的处理函数。

2.2、网页客户端登录过程

       当用户登录时,将自己的组id和用户id拼接成格式为“/groupxxx/userxxx”的字符串,然后发布到LOGIN_CHANNEL上去,对应的网页JS代码如下:

$.cometd.publish(LOGIN_CHANNEL,
   <!—这里是发布的消息-
,function(publishReply)
   <!—这里是发布的回调函数-
)
Bayeux服务器收到“/groupxxx/userxxx”字符串后,会为该网页客户端创建名为“/groupxxx/userxxx”的通道,并且服务器和客户端都会订阅这个通道以便接收对方发出的信息。 
网页JS代码:
$.cometd.subscribe(“/groupxxx/userxxx”,function()
   <!—回调函数
)

2.3、网页客户端订阅

       网页客户端登录之后,需要向服务器发送需要订阅的数据,对应的网页JS代码如下:

$.cometd.publish(“/groupxxx/userxxx”,
   <!—这里是需要订阅的内容-
,function(publishReply)
   <!—这里是发布的回调函数-
)

2.4、服务器接受订阅

       服务器在通道“/groupxxx/userxxx”上收到订阅内容后,会用map存放订阅通道名称与订阅内容。由于同一个内容可能被多个用户(通道)订阅,所以map的Key值是订阅内容(即API),value是个订阅该内容(API)的一个或多个通道名称。

2.5、服务器推送数据

        后台有数据更新会通过TRANSDATA_CHANNEL通道发给后台服务器,后台服务器通过与map中的key值(API)比较,找出订阅该内容的所有通道并且推送。

以上是关于使用CometD技术实现web系统中的主动推送的主要内容,如果未能解决你的问题,请参考以下文章

如何启动 ajax 推送网站(activemq 或 cometd 或其他)?

消息推送一 之介绍

python web服务端主动推送消息到浏览器页面的具体实现代码

1.使用SignalR实现页面即时刷新(服务端主动推送)

WebSocket基于Tomcat实现

消息推送技术