如何在Java EE 6中的消息驱动Bean中执行事务接收?

时间:2013-10-26 09:46:34

标签: java transactions jms

在整个网络上记录从MDB或其他代码发送事务处理消息。

但是如何使用MDB进行交易接收?我遇到的文档表明,与交易发送非常相似,您需要致电Session.commit()以确认收到消息。

但是,我无法弄清楚如何访问(JMS)会话实例!它似乎不是通过MessageDrivenContext实例提供的。

另外,我需要在MDB中使用BMT(bean托管事务)来控制涉及afterCompletion实例的javax.transaction.Synchronization方法的竞争条件。能够进行事务处理接收比从onMessage(Message)抛出(运行时)异常更好。

1 个答案:

答案 0 :(得分:3)

我认为这里对这个主题的理解有点错误。

MDB可以在BMT模式下使用,但随后onMessage会在auto ack模式下收到没有事务的消息。这意味着收到消息,稍后您可以开始自己的事务,将消息发送到队列。如果它被回滚,则onMessage收到的消息不会被"返回"回到接收队列,但它刚刚丢失。

MDB允许CMT使用事务属性REQUIREDNOT_SUPPORTEDejb 3.2 spec: 5.4.13 Transaction Context of Message-Driven Bean Methods)。 REQUIRED执行您所期望的操作 - 它会在onMessage方法中加入onMessage接收和您在一个全局事务下的操作。如果失败,它会将消息返回给接收队列,并且可以再次由MDB接收。使用NOT_SUPPORTED时,接收时的消息将自动执行,方法将在没有活动事务上下文的情况下运行。

如果您想使用事务同步,那么您应该使用TransactionSynchronizationRegistry。或者,如果使用Synchronization添加JTA TransactionManager