cometd java_Maven+Spring下用CometD实现server push技术

读一遍这个reference了解CometD的框架、用法和机制,然后通过它提供的例子学习一下细节,基本就会了。

摸索过程中更多的痛苦是怎么在Spring下正常运行,出现了各种问题,花了很多时间,当然很可能是因为我对Spring不够熟导致的?不得而知。

我用的CometD 2.4.0 + jetty 8.1 + Spring 3.1 + Maven 3.0.4

1. Server端实现

可直接参考CometD-demo中AuctionChatService.java,这个例子使用了CometD的分布式机制Oort,其中trackMembers方法展示了当user登陆后,如何在Seti中建立该user的mapping;privateChat方法展示了如何向指定user推送消息。

addService("/auction/chat/**", "trackMembers");

这句的功能是,所有发送到频道/auction/chat/**的消息,由trackMembers方法处理。

我是在一个Controller中初始化以上的这个server,注意到AuctionChatService的构造函数的参数是一个ServletContext,Spring的Controller中要想使用ServletContext,需implements ServletContextAware,然后加上:

@Autowired

private ServletContext servletContext;

2. Client端实现

因为CometD-demo中的Client的js代码有很多关于Auction的逻辑,对于理解CometD没多大帮助,所以不是很好的参考。

按照reference的:http://docs.cometd.org/reference/#primer_maven_way所示的方法,创建一个Maven的CometD项目,第二步选择5:cometd-archetype-spring-jquery-jetty7

这个项目建好后,项目中会生成一个application.js,很好的展示了怎么和CometD server建立Long Pulling的连接。这个js可以改一下直接用,主要是改以下这段:

function _metaHandshake(handshake)

{

if (handshake.successful === true)

{

cometd.batch(function()

{

cometd.subscribe('/hello', function(message)

{

$('#body').append('

Server Says: ' + message.data.greeting + '
');

});

// Publish on a service channel since the message is for the server only

cometd.publish('/service/hello', { name: 'World' });

});

}

}

cometd.subscribe('/hello'...这段代码是让Client端订阅/hello频道的消息,一旦server向/hello频道发送了消息,该Client就用上述匿名函数将message的信息显示在浏览器页面上;

cometd.publish('/service/hello'...这段代码是Client端向/service/hello频道发送一个消息,消息内容是一个map,其中的name值为world

server端的addService操作,为/service/hello频道关联了一个方法,该方法会收到Client发送的这个map,然后进行处理,处理的时候也许会将该map发送到/hello频道上,这样Client因为订阅了/hello频道,所以就可以显示消息了。

以上的逻辑如果搞明白了,基本上就能搭建起一个CometD的server push服务了,只不过在Spring下也许会碰到很多问题,我反正是遇到了很多,摸索了很久,写一写要注意的问题吧。

1. 官方的reference上有5.2.2.4. Services Integration with Spring,要先看一看。

2. web.xml中要包含cometd servlet、oort servlet、seti servlet,具体写法reference上都有,要注意它们的顺序依次为1、2、3(这是必须的)。然后自己项目的dispatcher的startup在它们后面(这个是不是必须的不知道,因为出问题时我改了各种东西,都不记得最终是哪个改动起作用了)。

3. pom文件不仅要包含CometD相关的各种依赖,有些情况下还要jetty的io、http等依赖,出现找不到某某类就先看看是不是依赖不够全。

4. eclipse下开发的话,要常project->clean,这件事真的真的会影响进度,因为有时改对了,因为没clean而导致又在那排查很久。。。

5. 任何诡异问题,解决了很久都解决不了,就要去读reference,多读一边就有更多发现。。。当然也可以去它的google groups中讨论,作者回复的很及时。(Storm的group和CometD的group的作者都很敬业,每天必回复几个问题,到底是啥让他们这么敬业呢?对技术的狂热么?哎,膜拜)

未完待续。

最后修改于 2012-02-17 18:44

阅读(?)评论(0)

下一篇:哎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值