我对JMS消息发送和recv同步的最佳模式有疑问......
我有一个C ++客户端通过HTTP使用JAX-RS(REST)与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 - 客户端调用“listener”REST资源,调用:
public void listen() {
...
consumer.recv(timeout);
...
}
并阻止,直到收到消息或超时到期。
3 - 当我在资源bean中进行一些更改时,它会调用
public void update(...) {
em.update(...);
producer.send(session.createMessage(CHANGE_NOTIFY_MESSAGE));
}
4 - “listener”资源从JMS获取消息并使用更改(创建的)对象信息将其返回给客户端,而不是客户端调用“get”方法来获取创建或更改的对象。
我的问题是“侦听器”在将更改写入数据库之前获取消息(我正在使用JPA),因此当客户端请求创建或更改对象时,此对象尚不存在或具有旧信息。
如何修改我的alghoritm,只有在将更改保存到数据库后才会收到通知?
提前感谢您的想法)))
答案 0 :(得分:0)
正如Steve C所说,我认为您需要使会话成为事务性的。一个例子:
// do the operation
em.getTransaction().begin();
em.update(p);
em.getTransaction().commit();
// now you can send
producer.send(session.createMessage(CHANGE_NOTIFY_MESSAGE));