我将实施类似于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>
答案 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)
该技术根据客户端使用的浏览器选择最佳的传输方式。
对于最新的浏览器,它使用Web套接字,而对于其他浏览器,它会优雅地降级为Flash Socket或Long Pooling。 See more here
您需要做的是使用这些技术设置服务器。服务器将在特定端口运行。所有客户端都会监听该端口,服务器可以通过该端口将数据推送到客户端。
答案 3 :(得分:4)
Comet也称为Reverse Ajax,是一种Web应用程序模型,其中长时间持有的HTTP请求允许Web服务器将数据推送到浏览器,而浏览器不会明确请求它。
Comet(AKA长期存在的http,服务器推送)允许服务器开始非常缓慢地回答浏览器的信息请求,并继续按照服务器规定的时间表回答。有关Comet的更多信息,请参阅以下内容:
Alex Russell的original post coining the term
Comet Daily,一个定期发布主题的博客
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);