JMS发送和recv同步

时间:2014-05-19 12:51:19

标签: java jpa jms

我对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,只有在将更改保存到数据库后才会收到通知?

提前感谢您的想法)))

1 个答案:

答案 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));