2

从 MDB 或其他代码发送已处理的消息在整个 Web 上都有记录。

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

但是,我不知道如何访问(JMS)会话实例!它似乎无法通过MessageDrivenContext实例获得。

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

4

1 回答 1

3

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

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

MDB 允许 CMT 使用事务属性REQUIREDNOT_SUPPORTEDejb 3.2 规范:5.4.13 消息驱动 Bean 方法的事务上下文)。REQUIRED做你所期望的 - 它在一个全局事务下加入onMessage接收和你的方法中的操作。onMessage如果失败,它会将消息返回到接收队列,并且可以再次被 MDB 接收。使用NOT_SUPPORTED时,接收时的消息将自动确认,并且方法在没有活动事务上下文的情况下运行。

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

于 2016-02-17T19:24:28.907 回答