如何从服务器向客户端发送消息?

时间:2013-06-27 07:11:18

标签: mysql hibernate java-ee struts2 notifications

我将实施类似于Facebook通知和本网站的内容(StackOverflow的通知,如果有人为我们的问题撰写评论/答案等,则会通知我们)。请注意,用户将使用我的应用程序作为网站而不是移动应用程序。

我遇到了获取结果的answer,但我需要推送结果而不是提取。

根据建议,我在我的实体类中创建了一个简单的方法,并在其中添加了@PostPersist,但基于this answer它没有工作。我添加了persistence.xml文件来定义监听器但是在会话之后.save(用户)aftersave方法不会被触发。

User.java

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

的persistence.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>

6 个答案:

答案 0 :(得分:13)

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

要拦截数据库访问权限,您可以使用@PostUpdate@PostPersist。这是相关的question

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

编辑:在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 ,另一件好事就是使用封面下的网络套接字它受到支持,否则就会退回其他解决方案。

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

答案 1 :(得分:4)

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

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

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

更新日期:2013年7月11日

Mqtt是一个发布/订阅,非常简单和轻量级的消息传递协议。如果服务器是发布者并且客户端浏览器订阅服务器发布到的主题,则服务器可以直接将消息推送到客户端。

一些有用的资源:

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

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

答案 2 :(得分:4)

使用Node JSsocket.io

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

对于最新的浏览器,它使用Web套接字,而对于其他浏览器,它会优雅地降级为Flash Socket或Long Pooling。 See more here

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

答案 3 :(得分:4)

Comet也称为Reverse Ajax,是一种Web应用程序模型,其中长时间持有的HTTP请求允许Web服务器将数据推送到浏览器,而浏览器不会明确请求它。

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

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

DWR提供与Spring,Struts,Guice,Hibernate等的集成。 您可以从here了解更多信息。

其他Comet和Reverse AJAX框架:

答案 4 :(得分:2)

  

但在session.save(用户)之后,aftersave方法不会被触发。

  • @PostPersist是JPA回调。
  • session.save()是一种非JPA,hibernate专有方法。 JPA使用entityManager.persist()
  • 您正在使用不兼容的功能

答案 5 :(得分:2)

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

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

}, 30000);