Java Web应用程序的推送通知[关闭]
Posted
技术标签:
【中文标题】Java Web应用程序的推送通知[关闭]【英文标题】:Push notification for Java web app [closed] 【发布时间】:2013-01-06 14:40:00 【问题描述】:目前我正在开发一个使用 Spring 3.1 和 Hibernate 4 的网络应用程序。
根据要求,我想在 JSP 页面上实现像 Facebook 那样的推送通知。如果您有任何建议,请同时列出兼容的浏览器及其版本。
【问题讨论】:
【参考方案1】:如果您可以升级到或正在使用 JDK 7,我建议使用 Vert.x Vertx.io,在客户端使用 Sockjs。 Vert.x 有一个完整的 sockjs 服务器实现,我会尝试提出一种实现方式,其余的请看文档
服务器实现可能是这样的
Vertx vertx = Vertx.newVertx();
EventBus eventBus = vertx.eventBus()
HttpServer server = vertx.createHttpServer();
JsonArray permitted = new JsonArray();
permitted.add(new JsonObject());
SockJSServer sockJSServer = new DefaultSockJSServer(vertx, server);
sockJSServer.bridge(new JsonObject().putString("prefix", "/pusher"), permitted, permitted);
server.listen(<some port>);
在客户端注册一个像这样的处理程序来加载文档
function ()
if (!eb)
eb = new vertx.EventBus("http://<your_host>:<your_port>/pusher");
eb.onopen = function()
console.log("connected")
;
eb.onclose = function()
console.log("Not connected");
eb = null;
;
然后您可以将处理程序注册到任何地址 - 这里的地址可以是任何地址,假设它是“AwesomeNotifications”
function subscribe(address)
if (eb)
eb.registerHandler(address, function(msg, replyTo)
console.log("Reply recieved")
);
完成所有设置后,您现在可以使用我们之前创建的事件总线将任何数据从服务器推送到该地址
eventBus.publish("AwesomeNotifications", new JsonObject(<some hashmap to serialize>))
希望对你有帮助
【讨论】:
【参考方案2】:您可以使用 html5 服务器发送选项。 在这里您可以了解更多详情
服务器发送选项:
http://www.w3schools.com/html/html5_serversentevents.asp
用于服务器发送的 Java 服务:
Java servlet and server sent events
教程:
http://peaktechie.blogspot.in/2012/04/small-tutorial-on-html5-server-sent.html
支持 HTML5 的浏览器:
http://fmbip.com/litmus
【讨论】:
这个不支持IE! IE 不是浏览器!【参考方案3】:我最近一直在研究这个。基于事件的方法非常适合构建单页 Web 应用程序,但也可以用于多页 Web 应用程序。
有很多方法可以做到这一点:
ActiveMQ AJAX - 直接从浏览器中的 javascript 发布和订阅 JMS 事件。这是非常基本的,与其他方法相比,花里胡哨的东西更少,但由于它很简单,如果你 a) 已经使用 activemq,b) 就像没有太多抽象层,这可能是一个很好的基础 Atmosphere - 基于事件的框架,可以根据当前使用的网络服务器和浏览器自动检测最佳通信机制。一个相当不错的框架,它支持browsers and web severs, even down to IE6 的完整传播。还有examples of using Atmosphere with spring MVC and Spring Integration。 Cometd - 基于 jetty/hightide 的 Bayeux 协议(自动协商最佳连接类型)的实现。 Jetty 是第一个支持延续的 Java 网络服务器,现在是最新的 Servlet 规范的一部分。 Cometd 采用 Jetty 并将其与 JS 客户端库一起包装,以自动检测到浏览器的最佳连接机制。 Vert.x - 一个基于事件的服务器平台,您可以在其上构建。最近 Vert.x 的作者离开 VMware 时,引起了一些争议,但 VMware 保留了该项目。现在看起来版本 2 将从 Eclipse 基金会发布。看起来很有前途,但水平很低。不是那种你只是插入现有的 java web 应用程序的东西。 HTML5 EventSource - 向浏览器发送事件的基于标准的方式。没有将事件发送回服务器的机制。这很有趣,但鉴于您需要为 IE6、IE7 和 IE8 实现回退,目前它可能不是您的最佳选择。最后,我认为对于作者的问题,集成到spring-mvc 项目,Atmosphere 显然是最合适的。
编辑:错别字
【讨论】:
【参考方案4】:我使用Atmosphere 来执行此操作。如果浏览器支持,它会使用 WebSocket,如果不支持,它会很好地回退到轮询。他们还有一个不错的 jQuery 插件,让生活变得简单。
【讨论】:
【参考方案5】:我建议您使用 Long Polling aka Comet
。我用它来向客户端抛出随机数。也可以参考this问题。
【讨论】:
【参考方案6】:我的建议是使用基于发布-订阅的 MQTT 中间件或 XMPP 协议。如果您计划发送小块消息,那么使用 MQTT 将是最合适的,因为它是最轻量级的方式。它有很多客户端库,包括 javascript,非常易于开发和管理。
【讨论】:
【参考方案7】:我们长期以来一直使用 XMPP 来支持推送通知,但是维护一个 Ejabber 服务器(或其他)非常困难。
另外,实际上我们已经转移到socket.io,它有客户端和服务器实现,但你必须维护 nodejs 服务器并开始使用 js。
我还在一个项目中测试了faye,并且非常适合 Ruby 环境。
但最后,我认为更好的解决方案是使用可以嵌入到服务器(java)中的库而忘记其他技术,我认为Atmosphere 也是一个很好的客户端和服务器解决方案。
【讨论】:
以上是关于Java Web应用程序的推送通知[关闭]的主要内容,如果未能解决你的问题,请参考以下文章