2014-05-19 43 views
1

我有个问题为JMS消息有关最佳模式发送和recv同步...JMS发送和recv同步

我有一个C++客户使用JAX-RS(REST)通过HTTP交谈J2EE服务器。在服务器端,我有两个EJB--一个用于资源操作,另一个用于会话状态跟踪(@Singleton)。我需要在服务器上更改,创建或删除时通知客户端。有喜欢的密码,当客户端连接和登录,会话bean创建临时JMS队列(非事务性) -

1:所以我做了这个方法

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 - 当我使资源豆一些改变它调用

public void update(...) { 
    em.update(...); 
    producer.send(session.createMessage(CHANGE_NOTIFY_MESSAGE)); 
} 

4 - “监听器”资源得到​​JMS消息,并将其与改变(创建)对象信息和非客户端调用返回到客户端“get”方法获取创建或更改的对象。

我的问题是,“监听者”在将更改写入数据库(我正在使用JPA)之前获取消息,因此当客户端请求创建或更改的对象时,此人尚不存在或具有旧信息。

如何修改我的alghoritm,只有在更改保存到数据库后才能得到通知?

感谢您的想法提前)))

+1

我认为你需要使会话事务,并使用XA数据源为您的JPA数据库连接。更新方法默认在事务中运行,因此数据库更改和消息发送将一起提交。您需要XA,因为您在一个tx中组合了两个不同的资源(数据库和队列)。 –

回答

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