【发布时间】:2011-11-14 18:37:04
【问题描述】:
我们有一个应用程序,它读取 JMS 并执行一些数据库事务,所有这些都作为一个 XA 事务的一部分。 如果我们发现消息有问题,我们想回滚数据库, 但是我们不希望 JMS 的回滚让我们再次读取消息(如果之前启动了回滚,我们不希望 MDB 再次触发整个过程)。
【问题讨论】:
标签: jms rollback message-driven-bean
我们有一个应用程序,它读取 JMS 并执行一些数据库事务,所有这些都作为一个 XA 事务的一部分。 如果我们发现消息有问题,我们想回滚数据库, 但是我们不希望 JMS 的回滚让我们再次读取消息(如果之前启动了回滚,我们不希望 MDB 再次触发整个过程)。
【问题讨论】:
标签: jms rollback message-driven-bean
为了确保我正确理解您:您有一个事务性消息驱动的 bean,它在数据库上执行一些操作。您仍然希望 MDB 成为 XA 事务的一部分,但您不希望数据库操作影响 MDB 参与的事务的状态。
话虽如此,有两种解决方案:
如果 MDB 在容器管理的事务中运行,请将所有数据库操作包装到带有 @REQUIRES_NEW 注释的 EJB 中 — 除非它们都已在此类事务上下文中运行。
如果您的 MDB 是 bean 管理的,则消息传递不是事务的一部分,因此无论如何都不会重新传递它 — EJB 核心合同的第 5.4.12 节和要求:
当使用 bean 管理的事务划分的消息驱动 bean 使用 javax.transaction。 UserTransaction 接口来划分事务,导致的消息接收 要调用的 bean 不是事务的一部分。
【讨论】: