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

J88*_*888 9 mysql notifications hibernate struts2 java-ee

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

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

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

User.java

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

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" />
Run Code Online (Sandbox Code Playgroud)

的pom.xml

 <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>4.2.1.Final</version>
            <type>jar</type>
        </dependency>
Run Code Online (Sandbox Code Playgroud)

Jir*_*ser 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());
  }
} 
Run Code Online (Sandbox Code Playgroud)

客户端:

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

    // update the UI with the new data
  }
}
Run Code Online (Sandbox Code Playgroud)

使用Errai的其他好处是将CDI放在服务器上和开箱即用的客户端上,另一件好事就是使用支持下的网络套接字,如果支持则退回到其他解决方案,否则.

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

  • 诀窍不在于db ......(因为jpa/hibernate提供了明确的解决方案)但是如何实现ajax.有一个用于此目的的框架称为氛围,可能值得一试:http://stackoverflow.com/questions/4003102/best-java-framework-for-server-side-websockets它试图解释客户端限制尽管我希望在不远的将来,websockets将成为这条路线唯一明智的选择. (2认同)