在整个网络上记录从MDB或其他代码发送事务处理消息。
但是如何使用MDB进行交易接收?我遇到的文档表明,与交易发送非常相似,您需要致电Session.commit()
以确认收到消息。
但是,我无法弄清楚如何访问(JMS)会话实例!它似乎不是通过MessageDrivenContext
实例提供的。
另外,我需要在MDB中使用BMT(bean托管事务)来控制涉及afterCompletion
实例的javax.transaction.Synchronization
方法的竞争条件。能够进行事务处理接收比从onMessage(Message)
抛出(运行时)异常更好。
答案 0 :(得分:3)
我认为这里对这个主题的理解有点错误。
MDB可以在BMT模式下使用,但随后onMessage
会在auto ack模式下收到没有事务的消息。这意味着收到消息,稍后您可以开始自己的事务,将消息发送到队列。如果它被回滚,则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
时,接收时的消息将自动执行,方法将在没有活动事务上下文的情况下运行。
如果您想使用事务同步,那么您应该使用TransactionSynchronizationRegistry
。或者,如果使用Synchronization添加JTA TransactionManager。