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

最佳答案

确保我理解正确:您有一个事务性消息驱动的Bean,它对数据库执行一些操作。您仍然希望MDB成为XA事务的一部分,但是您不希望数据库操作影响MDB参与的事务的状态。
话虽如此,有两种解决方案:

  • 如果MDB在容器管理的事务中运行,请将所有数据库操作包装到带有@REQUIRES_NEW批注的EJB中-除非它们已经全部在这样的事务上下文中运行。
  • 如果您的MDB是bean管理的,则消息传递不是事务的一部分,因此无论如何都将不会重新传递消息-EJB核心契约(Contract)和要求的5.4.12节:

  • 关于jms - JMS/MDB回滚,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7378709/

    10-12 06:23