2

我们有一个应用程序,它读取 JMS 并执行一些数据库事务,所有这些都作为一个 XA 事务的一部分。如果我们发现消息有问题,我们想要回滚数据库,但我们不希望回滚 JMS让我们再次阅读该消息(如果之前启动了回滚,我们不希望 MDB 再次触发整个过程)。

4

1 回答 1

6

为了确保我正确理解您:您有一个事务性消息驱动的 bean,它在数据库上执行一些操作。您仍然希望 MDB 成为 XA 事务的一部分,但您不希望数据库操作影响 MDB 参与的事务的状态。

话虽如此,有两种解决方案:

  1. 如果 MDB 在容器管理的事务中运行,则将所有数据库操作包装到带有@REQUIRES_NEW注释的 EJB 中 — 除非它们已经全部在此类事务上下文中运行。

  2. 如果您的 MDB 是 bean 管理的,则消息传递不是事务的一部分,因此无论如何都不会重新传递——EJB 核心合同和要求的第 5.4.12 节:

    当使用 bean 管理的事务划分的消息驱动 bean 使用 javax.transaction。用于划分事务的 UserTransaction 接口,导致调用 bean 的消息接收不是事务的一部分。

于 2011-09-15T12:32:11.430 回答