Java Web 应用的推送通知

19

目前我正在开发一个使用Spring 3.1和Hibernate 4的Web应用程序。

按照要求,我想在JSP页面上实现像Facebook一样的推送通知。如果您有任何建议,请列出兼容的浏览器及其版本。

7个回答

24

如果您可以升级到JDK 7或正在使用JDK 7,我建议使用Vert.xVertx.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>))

希望这能帮到您


13

此内容不支持IE浏览器! - shareef
1
IE 不是浏览器! - Stanley Mungai

9
我最近一直在研究这个。基于事件的方法是构建单页面Web应用程序的好方法,但也可以用于多页面Web应用程序。
有几种方法可以实现这一点:
  • ActiveMQ AJAX - 直接从浏览器的Javascript中发布和订阅JMS事件。这是相当基础的,比其他方法更简单,但由于它的简单性,如果您a)已经使用activemq,b)不喜欢太多的抽象层,则可能是一个很好的起点。
  • Atmosphere - 基于事件的框架,可以根据当前使用的Web服务器和浏览器自动检测最佳通信机制。一个相当不错的框架,支持全面的浏览器和Web服务器,甚至包括IE6。并且有使用Spring MVC和Spring Integration使用Atmosphere的示例
  • Cometd - 基于jetty/hightide的Bayeux协议实现(自动协商最佳连接类型)。Jetty是第一个支持continuations的Java Web服务器,现在是最新Servlet规范的一部分。 Cometd将Jetty与JS客户端库包装在一起,以自动检测最佳的连接机制到浏览器。
  • Vert.x - 一个事件驱动的服务器平台,您可以在其上构建。最近Vert.x的作者离开VMware时曾引起争议,但VMware保留了该项目。现在看来版本2将从Eclipse基金会发布。看起来非常有前途,但相当低级别。不是您只需插入现有Java Web应用程序的那种东西。
  • HTML5 EventSource - 发送事件到浏览器的标准方法。没有发送事件回服务器的机制。它很有趣,但考虑到您需要为IE6、IE7和IE8实现后备,现在可能不是您最好的选择。

我认为对于提问者来说,将Atmosphere集成到项目中是最合适的选择。

编辑:修正了拼写错误。


7

我使用了Atmosphere工具来实现这个功能。它会优先使用WebSockets协议与浏览器进行通信,当不支持时则会智能的切换到轮询方式。此外,他们还提供了方便易用的jQuery插件。


1
我建议您选择长轮询,也称为Comet。我用它向客户端发送随机数。您还可以参考这个问题。

0

我的建议是使用基于发布-订阅的MQTT中间件或XMPP协议。如果您计划发送小块消息,则最适合使用MQTT,因为它是最轻量级的方式。它有很多客户端库,包括JavaScript,并且非常易于开发和管理。


0

我们长期使用XMPP来支持推送通知,但是维护Ejabber服务器(或其他)非常困难。

此外,我们现在已经转向socket.io,它具有客户端和服务器实现,但您必须维护nodejs服务器并开始使用js。

我还在一个项目中测试了faye,在Ruby环境中完美运行。

但最终,我认为更好的解决方案是使用可以嵌入到您的服务器(Java)中并忘记其他技术的库,我认为Atmosphere也是一个很好的解决方案,同时具有客户端和服务器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接