Java HTTP推送(消息传递)的最佳解决方案

Java HTTP推送(消息传递)的最佳解决方案,java,http,jms,comet,messaging,Java,Http,Jms,Comet,Messaging,我们希望将数据从服务器推送到客户端,但只能使用HTTP(端口80)。消息传递的最佳解决方案是什么?一个想法是。还有其他的想法或框架可以提供JMS over HTTP吗。(是的,ActiveMQ也支持它,但是waggly IMHO。JXTA也支持它,但是配置很复杂。简单的东西是首选。)最简单的解决方案是使用基于Comet的方法(就像你提到的)。这意味着客户机(您要向其“推送”消息)打开长期HTTP连接。这些连接保持打开状态,直到超时或您向客户端发送消息。一旦发生任何一种情况,客户端就会打开一个新连

我们希望将数据从服务器推送到客户端,但只能使用HTTP(端口80)。消息传递的最佳解决方案是什么?一个想法是。还有其他的想法或框架可以提供JMS over HTTP吗。(是的,ActiveMQ也支持它,但是waggly IMHO。JXTA也支持它,但是配置很复杂。简单的东西是首选。)

最简单的解决方案是使用基于Comet的方法(就像你提到的)。这意味着客户机(您要向其“推送”消息)打开长期HTTP连接。这些连接保持打开状态,直到超时或您向客户端发送消息。一旦发生任何一种情况,客户端就会打开一个新连接

直接连接到客户端可能会有很多问题,原因有很多:它们可能位于防火墙后面,防火墙不允许这样做,它们可能位于代理后面,等等


除非您的客户机是真正的服务器(在这种情况下,您就是真正的客户机),否则请让他们与您联系并发送响应以模拟推送;实际上,服务器订阅了JMS,COMET将消息推送到浏览器。作为一名开发人员,“感觉”就像浏览器订阅了JMS。这“刚刚奏效”,所以我们没有进一步寻找替代方案


我可以想象在浏览器中使用HTTP作为传输的纯JavaScriptJMS实现,但我的想法是这将是非常沉重的。我不知道有这样的实现。

与已经讨论过的方法(如Comet等)不同的另一种方法是在客户端实现轮询。这种方法的缺点是,从消息/事件发生到客户机收到消息/事件,不可避免地会有延迟。如果您的应用程序对此类延迟非常敏感,则轮询将被取消


如果一定量的延迟(至少几秒钟)是可以接受的,那么轮询就不是对HTTP协议的滥用。它还可以更好地抵御临时网络故障,因为默认情况下,服务器会对消息进行排队,如果客户端不能按计划使用,它也不会感到不安。

而且都是开源框架,可以使Comet在Java中变得简单。

我使用Comet、Raphael、Bayeux、,Java和Maven运行PaasCloudBees并写了一篇关于它的博客文章,希望它能对某些人有所帮助


是这样吗?当消息到达浏览器时,会打开一个新连接?应将客户端编程为打开一个新连接。如果没有,服务器将无法与客户端通信。对不起。理解有困难。客户端已打开一个长期HTTP连接。服务器在上面发送消息-对吗?然后你会说“这些连接一直保持打开状态,直到它们超时为止,或者你向客户端发送一条消息。一旦出现任何一种情况,客户端就会打开一个新连接。”听起来我们正在打开第二个连接。为什么?我们刚刚收到的消息包含了我们想要的数据,不是吗?新的连接是为了监听下一条消息。这里的想法是始终保持与服务器的开放连接,而这只是等待服务器对其执行某些操作。这允许服务器(实际上)启动通信。一旦服务器使用该连接发送消息,就需要为下一条消息打开一个新连接。所有这些都假设我们有一个客户端,服务器需要能够将数据推送到该客户端。另一种选择是定期调查变更,但这可能会造成事件到达客户时的延迟(抱歉,我在这里罗嗦了,但这与我的经验根本不符)。连接是长期存在的,服务器周期性地喷射数据,浏览器线程吸收并显示数据。我不明白为什么我们需要继续打开更多的连接。现在,我已经在浏览器中更新了实时测量数据,而且只有一个连接(我想),轮询和长期连接之间并没有太大区别。在这两种情况下,您都会启动一个轮询,它会立即返回,或者延迟返回。延迟时间越长,打开的连接就越少。在所有情况下,诸如电话终止或无人接听等问题都会导致下一次投票。在HTTP/1.1中,(TCP)连接通常保持打开状态。链接不工作。