【发布时间】:2013-10-15 16:58:13
【问题描述】:
我们有一个我们认为相当常见的 XA 用例:
- 从队列中读取消息
- 将一些数据写入数据库
- 向出队(不同于入队)写入响应消息
但是,我们还需要一种方法来处理内部错误和有害消息。我们想到的控制流是这样的:
- 从队列中读取消息
- 写入数据库
- 如果出现异常回滚数据库事务
- 如果没有异常在数据库上运行 commit phase1
- 如果一切顺利(没有回滚和提交阶段 1 ok),则向 out-queue 写入成功消息
- 如果数据库上的提交阶段 1 失败或出现异常并且数据库事务已回滚,则将失败消息写入出队列
- 提交入队、出队和数据库(除非因为异常而滚动)
这是一个好方法吗,我们应该采取不同的做法吗?我们如何使用 EJB 做到这一点?
我们在 JBoss AS 7.2 / EAP 6.1 上使用 EJB 3.1,可以选择直接针对 Narayana 进行编码。 JDBC驱动是ojdbc7-12.1.0.1,JMS RAR是MQ系列(不知道版本)。
【问题讨论】:
-
这将从根本上改变 XA 协议,你不觉得吗?而且我很确定您将无法做到这一点。为什么不简单地配置您的 JMS 提供程序,让消息侦听器尝试消费消息 N 次,如果所有 N 次尝试都失败,则将消息发送到错误队列?
-
我将其视为一种嵌套事务。是的,我知道 JTA 不支持嵌套事务,但这是一个边缘情况,资源本身不必支持嵌套事务,只有事务管理器(Narayana AFAIK 支持)。
-
嗯,您将如何在第 2 步和第 5 步中提交到数据库?第 5 步要提交什么?难道你不能只使用标准的分布式事务,以便在第 5 步提交所有内容,如果其中任何一个失败,则整个过程将回滚并发送失败消息到队列外?
标签: jdbc transactions ejb jms xa