JMS/MDB 回滚
我们有一个应用程序,它读取 JMS 并执行一些数据库事务,所有这些都是 XA 事务的一部分。 如果我们发现消息有问题,我们想要回滚数据库, 但我们不希望 JMS 回滚让我们再次读取消息(如果先前已启动回滚,我们不希望 MDB 再次触发整个过程)。
We have a application, which reads of JMS and does some database transactions, all as part of one XA transaction..
If we find the message has some problems, we want to rollback the database,
but we don’t want the rollback off JMS to have us read the message again(we don't want the MDB to trigger the entire process one more if rollback was previously initiated).
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
为了确保我正确理解您:您有一个事务性消息驱动 bean,它对数据库执行一些操作。您仍然希望 MDB 成为 XA 事务的一部分,但您不希望数据库操作影响 MDB 参与的事务的状态。
话虽如此,有两种解决方案:
< strong>如果 MDB 在容器管理的事务中运行,请使用
@REQUIRES_NEW
注释将所有数据库操作包装到 EJB 中 - 除非它们已全部在此类事务上下文中运行。< /p>如果您的 MDB 是 Bean 管理的,则消息传递不是事务的一部分,因此无论如何它都不会被重新传递 — EJB 核心契约的第 5.4.12 节和要求:
<块引用>
当消息驱动 bean 使用 bean 管理的事务划分时,使用 javax.transaction。
UserTransaction接口来划分事务,引起的消息接收
要调用的 bean 不是事务的一部分。
To be sure I understand you correctly: you have a transactional message-driven bean that performs some actions on database. You still want the MDB to be a part of XA transaction, but you don't want the database actions to influence the state of the transaction in which the MDB takes part in.
That being said, there are two solutions:
If the MDB runs within a container-managed transaction, wrap all the database actions into an EJB with
@REQUIRES_NEW
annotation — unless they're already all run in such transactional context.If your MDB is bean-managed, the message delivery is NOT a part of transaction, so it will not be redelivered, no matter what — section 5.4.12 of EJB Core Contracts and Requirements: