来自无状态EJB的JMS同步请求 - 回复

时间:2010-10-11 15:03:42

标签: java-ee ejb-3.0 jms

我有一个基于JMS队列的系统,可以使整个系统以异步方式工作。

现在,对于某些定期任务,我需要以同步的方式执行一些非耗时的任务,这样我就可以立即对结果做一些事情,而无需使用数据库来存储请求并将其与结果配对(与async一样)操作)。

代码本身不是问题,但EJB运行容器事务的事实,这意味着producer.send()代码和consumer.receive()不会按顺序执行(即消息不发送,所以没有接收()接收()以下几行。

如何在无状态EJB3环境中以同步方式发送JMS消息并收到响应?

感谢您的回答,

博若

2 个答案:

答案 0 :(得分:1)

您可以将bean切换为使用Bean管理的事务。

@MessageDriven
@TransactionManagement(BEAN)
public class MyMDB implements MessageListener {

  // this is optional
  @Resource
  private UserTransaction ut;

  //...

}

答案 1 :(得分:1)

您应该了解EJB中影响通过JMS发送请求/回复消息的事务上下文。

“解决方案是暂停事务,创建新事务,发送请求,提交新事务,取消暂停第一个事务,然后继续。”

在下面的URL中,您将找到问题陈述和解决方案。 顺便说一句,这适用于容器管理和bean管理的事务。

http://blogs.oracle.com/fkieviet/entry/request_reply_from_an_ejb