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

如何在JavaEE6中的消息驱动Bean中执行事务接收?,java,transactions,jms,Java,Transactions,Jms,从MDB或其他代码发送事务性消息在web上都有文档记录 但是如何使用MDB进行事务处理接收?我遇到的文档表明,与事务处理发送非常类似,您需要调用Session.commit()来确认消息的接收 但是,我不知道如何访问(JMS)会话实例!它似乎无法通过MessageDrivenContext实例获得 此外,我需要在MDB中使用BMT(bean管理的事务),以便控制涉及javax.transaction.Synchronization实例的afterCompletion方法的竞争条件。能够进行事务性

从MDB或其他代码发送事务性消息在web上都有文档记录

但是如何使用MDB进行事务处理接收?我遇到的文档表明,与事务处理发送非常类似,您需要调用
Session.commit()
来确认消息的接收

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


此外,我需要在MDB中使用BMT(bean管理的事务),以便控制涉及
javax.transaction.Synchronization
实例的
afterCompletion
方法的竞争条件。能够进行事务性接收要比从
onMessage(Message)
抛出(运行时)异常好得多。我认为对这个主题的理解有点错误

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

MDB允许使用CMT事务属性
必需
不受支持
()
REQUIRED
实现了您期望的功能—它将
onMessage
接收和您在
onMessage
方法中的操作合并到一个全局事务下。如果失败,它会将消息返回到接收队列,MDB可以再次接收该消息。当使用不支持的
时,接收时的消息将自动确认,并且方法在没有活动事务上下文的情况下运行


如果要使用事务同步,则需要使用
TransactionSynchronizationRegistry
。或者,如果使用.

添加JTA,我找到了一个解决方案,但显然大多数人不同意我的解决方案,所以我将其删除。