10

我将实现类似于 Facebook 通知和这个网站的东西(StackOverflow 的通知,它会通知我们是否有人为我们的问题写评论/答案等)。请注意,用户会将我的应用程序用作网站而不是移动应用程序。

我遇到了以下获取结果的答案,但我需要推送结果而不是获取。

根据建议,我在我的实体类中创建了一个简单的方法并向其中添加了@PostPersist,但它没有起作用,因此基于这个答案我添加了 persistence.xml 文件来定义侦听器,但在 session.save(user) 之后aftersave 方法不会被触发。

用户.java

@Entity
public class User{
  .....
  @PostPersist
    public void aftersave(){
        System.err.println("*****this is post persist method****");
    }
}

持久性.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<!--
To change this template, choose Tools | Templates
and open the template in the editor.
-->

<property name="hibernate.ejb.event.pre-insert"  value="my.hibernate.events.listeners.Listener" />
<property name="hibernate.ejb.event.pre-update"  value="my.hibernate.events.listeners.Listener" />
<property name="hibernate.ejb.event.pre-delete"  value="my.hibernate.events.listeners.Listener" />
<property name="hibernate.ejb.event.post-insert" value="my.hibernate.events.listeners.Listener" />
<property name="hibernate.ejb.event.post-update" value="my.hibernate.events.listeners.Listener" />
<property name="hibernate.ejb.event.post-delete" value="my.hibernate.events.listeners.Listener" />

pom.xml

 <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>4.2.1.Final</version>
            <type>jar</type>
        </dependency>
4

6 回答 6

13

听起来像是WebSockets的任务。它是 Java EE 7 的一部分,因此 Glassfish 应该是第一个支持它的 AS。

为了拦截数据库访问,您可以使用@PostUpdate@PostPersist。这是相关的问题

有很多方法可以执行所谓的服务器推送来通知连接的客户端:

编辑:在 Java 世界中,有几个框架可以开箱即用地实现服务器推送(反向 ajax)。如果您熟悉GWT,我建议您使用Errai。其他选择是Atmospere。Atmospere 的缺点是它需要在您的常规应用程序服务器旁边使用您的 Web 应用程序独立运行进程。一年前我正在玩它,所以从那时起这可能已经改变了。

一般来说,很难为您提供一段具体的代码,因为它取决于您将选择的框架。我熟悉Errai,所以这里有一个例子:

服务器端:

@ApplicationScoped
public class TickerService {

  @Inject
  private Event<Tick> tickEvent;

  private void sendTick() {
    tickEvent.fire(new Tick());
  }
} 

客户端:

@EntryPoint
public class TickerClient {
  public void tickHappened(@Observes Tick tick) {

    // update the UI with the new data
  }
}

使用 Errai 的其他好处是服务器和客户端上的CDI开箱即用,另一件很好的事情是在支持的情况下使用幕后的 web-sockets,否则回退到其他解决方案.

无论您选择什么,它都应该适合您现有的基础架构和客户端 UI 框架。

于 2013-06-27T13:01:18.627 回答
4

使用Node JSsocket.io

该技术根据客户端使用的浏览器选择最佳传输方式。

对于最新的浏览器,它使用 Web Sockets,而对于其他浏览器,它会优雅地降级为 Flash Socket 或 Long Pooling。在这里查看更多

您需要做的是使用这些技术设置服务器。服务器将在特定端口上运行。所有客户端都将侦听该端口,并且服务器将能够通过该端口将数据推送到客户端。

于 2013-07-19T06:47:20.950 回答
4

Comet 也称为Reverse Ajax,是一种 Web 应用程序模型,其中长期持有的 HTTP 请求允许 Web 服务器将数据推送到浏览器,而无需浏览器显式请求。

Comet(又名长期存在的 http,服务器推送)允许服务器开始非常缓慢地响应浏览器的信息请求,并按照服务器规定的时间表继续响应。有关彗星的更多信息,请参阅以下内容:

DWR是一个 Java 库,它使服务器上的 Java 和浏览器中的 JavaScript 能够尽可能简单地进行交互和调用。借助 Reverse Ajax,DWR 允许在服务器上运行的 Java 代码使用客户端 API 将更新发布到任意组浏览器。这允许交互两种方式 - 浏览器调用服务器和服务器调用浏览器。DWR 支持 Comet、Polling 和 Piggyback(通过正常请求发送数据)作为发布到浏览器的方式。

DWR 提供与 Spring、Struts、Guice、Hibernate 等的集成。您可以从这里阅读更多内容。

其他 Comet 和 Reverse AJAX 框架:

于 2013-07-19T07:10:15.683 回答
4

mqtt 可用于服务器推送和消息广播。

http://mqtt.org/中有更多详细信息。

=======================================

更新日期:2013 年 7 月 11 日

Mqtt 是一个发布/订阅,极其简单和轻量级的消息传递协议。如果服务器是发布者,客户端浏览器订阅服务器发布的主题,那么服务器可以直接向客户端推送消息。

一些有用的资源:

Mosquitto是一个开源的 mqtt 服务器。易于安装和配置。

mqtt-client是一个经过验证的强大的 java mqtt 客户端。

于 2013-07-09T03:50:25.510 回答
2

但是在 session.save(user) 之后,不会触发 aftersave 方法。

  • @PostPersist是一个 JPA 回调。
  • session.save()是一种非 JPA、hibernate 专有方法。JPA 使用entityManager.persist().
  • 您正在使用不兼容的功能
于 2013-07-04T05:32:01.373 回答
2

每 30 秒或根据要求检查服务器的更新。

window.setInterval(function(){
  /// call your function here
 //Make AJAX call
 //Update Respective HTML Contact i,e, DIV

}, 30000);
于 2013-07-25T10:47:05.263 回答