我们希望将数据从服务器推送到客户端,但只能使用HTTP(端口80)。消息传递的最佳解决方案是什么?一个想法是Comet。是否有其他想法或框架可以提供JMS over HTTP。 (是的,ActiveMQ也支持它,但是哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇。
答案 0 :(得分:9)
出于许多原因,最简单的解决方案是使用基于Comet的方法(就像你提到的那样)。这意味着客户端(您希望“推送”消息)打开长期存在的HTTP连接。这些连接保持打开状态,直到超时或您向客户端发送消息。一旦发生任何一个,客户端就会打开一个新连接。
直接连接到客户端可能存在问题,原因有很多:它们可能落后于不允许的防火墙,它们可能落后于代理等等。
除非您的客户是真正的服务器(在这种情况下,您真的是客户端),请让他们与您联系并发送模仿推送的回复。
答案 1 :(得分:7)
Atmosphere和DWR都是开源框架,可以简化Java中的Comet。
答案 2 :(得分:1)
我们使用WAS Web 2.0 Feature Pack将COMET与JMS结合使用;实际上,服务器执行了JMS订阅,COMET将消息推送到浏览器。作为开发人员,它“感觉”就像浏览器订阅了JMS一样。这“只是有效”,所以我们没有进一步研究替代方案。
我可以想象在浏览器中使用HTTP作为传输的纯JavaScript JMS实现,但我的指令是,这将是非常重量级的。我知道没有这样的实现。
答案 3 :(得分:1)
已经讨论过的替代方法(即Comet等)是在客户端实施轮询。这种方法的缺点是,从消息/事件发生到客户端接收消息时,您不可避免地会有延迟。如果您的申请对此类延迟非常敏感,则轮询结束。
如果可以接受一定量的延迟(至少在几秒的数量级内),则轮询不再是滥用HTTP协议。它对于临时网络故障也更加强大,因为默认情况下服务器会对消息进行排队,如果客户端在其计划中不可用,也不会感到沮丧。
答案 4 :(得分:1)
我使用Comet,Raphael,Bayeux,Java和Maven运行PaaS Cloudbees创建了一个示例应用程序,并撰写了一篇关于它的博客文章,希望它对某人有所帮助。
http://geeks.aretotally.in/thinking-in-reverse-not-taking-orders-from-yo