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

标签 mysql hibernate jakarta-ee struts2 notifications

我将实现类似于 Facebook 通知和本网站的功能(StackOverflow 的通知会通知我们是否有人针对我们的问题发表评论/回答等)。请注意,用户会将我的应用程序用作网站而非移动应用程序。

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

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

用户.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>

最佳答案

听起来像是 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 框架。

关于mysql - 如何从服务器向客户端发送消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17336804/

相关文章:

php - 必须插入varchar时如何将数组插入MySQL

java - 为什么我在控制台 "Unknown column ' worklogent0_.workerEntity' in 'field list' 中出现此错误?

java - 事务提交后 Hibernate 线程未完成

java - 一对多关系中的子项不会在 JPA 中删除

hibernate - 在多个 Tomcat webapps 之间共享本地 ehcache

GCP App Engine 中的 Python 语法错误

PHP 将数据插入 mySQL 两次而不是一次

java - JAX-RS 资源作为 POJO 与 CDI 与 EJB

jakarta-ee - 在 Debian 7.1.0 上安装 Java EE 7 SDK

java - Glassfish JDBCRealm 登录异常