Java JMS发送和接收同步
我有一个关于JMS消息发送和接收同步的最佳模式的问题Java JMS发送和接收同步,java,jpa,jms,Java,Jpa,Jms,我有一个关于JMS消息发送和接收同步的最佳模式的问题 我有一个C++客户端,通过JAX-RS(REST)在HTTP上与J2EE服务器进行对话。在服务器端,我有两个EJB—一个用于资源操作,另一个用于会话状态跟踪(@Singleton)。当服务器上的某些内容被更改、创建或删除时,我需要通知客户端。所以我采取了这个方法: 1-当客户端连接并登录时,会话bean创建临时jms队列(非事务性),代码如下: connection = connectionFactory.createConnection()
我有一个C++客户端,通过JAX-RS(REST)在HTTP上与J2EE服务器进行对话。在服务器端,我有两个EJB—一个用于资源操作,另一个用于会话状态跟踪(@Singleton)。当服务器上的某些内容被更改、创建或删除时,我需要通知客户端。所以我采取了这个方法:
1-当客户端连接并登录时,会话bean创建临时jms队列(非事务性),代码如下:connection = connectionFactory.createConnection();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
connection.start();
producer = session.createProducer(queue);
consumer = session.createConsumer(queue);
2-客户端调用“侦听器”REST资源,该资源调用:
public void listen() {
...
consumer.recv(timeout);
...
}
并阻止,直到收到消息或超时过期
3-当我在资源bean中做一些更改时,它会调用
public void update(...) {
em.update(...);
producer.send(session.createMessage(CHANGE_NOTIFY_MESSAGE));
}
4-“侦听器”资源从JMS获取消息,并将其返回给具有已更改(创建)对象信息的客户端,然后客户端调用“get”方法来获取已创建或更改的对象
我的问题是,“侦听器”在将更改写入数据库之前获取消息(我使用的是JPA),所以当客户端请求创建或更改的对象时,这个对象还不存在,或者有旧信息
如何修改我的alghoritm,使其仅在更改保存到数据库后收到通知
(提前感谢您的想法)如前所述,我认为您需要使会话具有事务性。例如:
// do the operation
em.getTransaction().begin();
em.update(p);
em.getTransaction().commit();
// now you can send
producer.send(session.createMessage(CHANGE_NOTIFY_MESSAGE));
我认为您需要使会话具有事务性,并为您的JPA db连接使用XA数据源。默认情况下,更新方法在事务中运行,因此数据库更改和消息发送将一起提交。您需要XA,因为您要在一个tx中组合两个不同的资源(数据库和队列)。