我将实现类似于 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 .
有很多方法可以执行所谓的服务器推送来通知连接的客户端:
- 投票(您在问题中提供的链接(“我们到了吗?我们到了吗?...”))
- long polling (更智能的轮询方式 - 使用 keepalive 消息的长生命周期 HTTP 技术)
- WebSockets ( JSR 356 )
- piggy-backing
- SPDY ( wiki )
- Server-Sent Events ( related answer , wiki )
编辑:在 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/