Java HTTP推送(消息传递)的最佳解决方案
我们希望将数据从服务器推送到客户端,但只能使用HTTP(端口80)。 消息传递的最佳解决方案是什么? 一个想法是Comet 。 是否有其他想法或框架可以提供JMS over HTTP。 (是的,ActiveMQ也支持它,但是哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇。
出于许多原因,最简单的解决方案是使用基于Comet的方法(就像你提到的那样)。 这意味着客户端(您希望“推送”消息)打开长期存在的HTTP连接。 这些连接保持打开状态,直到超时或您向客户端发送消息。 一旦发生任何一个,客户端就会打开一个新连接。
直接连接到客户端可能有问题,原因有很多:它们可能落后于不允许的防火墙,它们可能落后于代理等等。
除非您的客户是真正的服务器(在这种情况下,您真的是客户端),让他们与您联系并发送模仿推送响应。
Atmosphere和DWR都是开源框架,可以使Comet在Java中变得简单。
我们使用WAS Web 2.0 Feature Pack将COMET与JMS结合使用; 实际上,服务器执行了JMS订阅,COMET将消息推送到浏览器。 作为开发人员,它“感觉”就像浏览器订阅了JMS一样。 这“只是有效”,所以我们没有进一步寻找替代品。
我可以想象在浏览器中使用HTTP作为传输的纯JavaScript JMS实现,但我的箴言是这将是非常重量级的。 我知道没有这样的实现。
已经讨论过的替代方法(即Comet等)是在客户端实现轮询。 这种方法的缺点是,从消息/事件发生到客户端接收消息时,您不可避免地会有延迟。 如果您的应用程序对此类延迟非常敏感,则轮询将结束。
如果一定量的延迟(至少在几秒的数量级内)是可接受的,则轮询不再是滥用HTTP协议。 它对于临时网络故障也更加强大,因为默认情况下服务器会对消息进行排队,如果客户端在其计划中不可用,也不会感到沮丧。
我使用Comet,Raphael,Bayeux,Java和Maven运行PaaS Cloudbees创建了一个示例应用程序,并撰写了一篇关于它的博客文章,希望它对某人有所帮助。
http://geeks.aretotally.in/thinking-in-reverse-not-taking-orders-from-yo
- 在HttpServletRequest.getParameterValues()中对值进行排序
- Java – 通过POST方法轻松发送HTTP参数
- HTTPClient-1.4.2:自定义SSL上下文示例所需的说明
- 在Java Servlet的上下文中,URL重写和转发有什么区别?
- 有没有办法从Java servlet处理程序获取原始http请求流?
- 如何在Android中使用DefaultHttpClient创建持久性Cookie?
- 从Java中的特定IP生成HttpRequest
- 使用Java提交HTML表单数据以从jsp应用程序检索下载
- HttpURLConnection conn.getRequestProperty返回null