java - 如何在 Java EE 6 中的消息驱动 Bean 中进行事务处理接收?

标签 java transactions jms

发送来自 MDB 或其他代码的事务处理消息在整个网络上都有记录。

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

但是,我不知道如何访问(JMS) session 实例!它似乎无法通过 MessageDrivenContext 实例使用。

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

最佳答案

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

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

MDB 允许使用 CMT 事务属性 REQUIREDNOT_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/

相关文章:

java - WAS 7.0 - MDB 中的默认拦截器

multithreading - 在 grails 中创建临时队列,创建大量临时队列

java - PrintWriter 只写部分文本

java - 自动调用和数据库回滚

java - 有Commons所有子串函数吗?

mysql - Laravel lockForUpdate + 事务

Java Spring 事务管理

spring-boot - 如何停止/启动/暂停@JmsListener(干净的方式)

java - 如何在java中转换时间数据?

java - 在具有许多不同类型节点的树结构中实现搜索功能