发送来自 MDB 或其他代码的事务处理消息在整个网络上都有记录。
但是如何使用 MDB 进行事务处理接收?我遇到的文档表明,与事务发送非常相似,您需要调用 Session.commit() 来确认消息的接收。
但是,我不知道如何访问(JMS) session 实例!它似乎无法通过 MessageDrivenContext
实例使用。
此外,我需要在 MDB 中使用 BMT(bean 管理事务)来控制涉及 javax.transaction.Synchronization
的 afterCompletion
方法的竞争条件实例。能够进行事务处理接收比从 onMessage(Message)
抛出(运行时)异常更好。
最佳答案
我认为这里对这个主题的理解有点错误。
MDB 可以在 BMT 模式下使用,但随后 onMessage
在自动确认模式下收到一条没有事务的消息。这意味着消息已收到,稍后您可以启动自己的事务,将消息发送到队列。如果回滚,onMessage
接收到的消息不会“返回”到接收队列,而只是丢失。
MDB 允许使用 CMT 事务属性 REQUIRED
和 NOT_SUPPORTED
( ejb 3.2 spec: 5.4.13 Transaction Context of Message-Driven Bean Methods )。 REQUIRED
执行您所期望的操作 - 它将 onMessage
接收和您在一个全局事务下的 onMessage
方法中的操作结合起来。如果失败,它会将消息返回到接收队列,并可以再次被 MDB 接收。当使用 NOT_SUPPORTED
时,接收时的消息会自动确认,并且方法在没有 Activity 事务上下文的情况下运行。
如果您想使用事务同步,那么您应该使用TransactionSynchronizationRegistry
。或者如果添加 JTA Synchronization使用TransactionManager .
关于java - 如何在 Java EE 6 中的消息驱动 Bean 中进行事务处理接收?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19605186/