我们有一个我们认为是相当常见的 XA 用例:
- 从队列中读取消息
- 将一些数据写入数据库
- 将响应消息写入出队(与入队不同)
然而,我们还需要一种方法来处理内部错误和有害消息。我们想到的控制流是这样的:
- 从队列中读取消息
- 写入数据库
- 如果有异常回滚数据库事务
- 如果没有异常在数据库上运行 commit phase1
- 如果一切顺利(没有回滚和提交阶段 1 ok),则向 out-queue 写入成功消息
- 如果数据库上的提交阶段 1 失败或出现异常并且数据库事务已回滚,则将失败消息写入出队列
- 提交 in-queue、out-queue 和数据库(除非因为异常而滚动)
这是一个好方法吗,我们应该采取不同的做法吗?我们如何使用 EJB 做到这一点?
我们在 JBoss AS 7.2 / EAP 6.1 上使用 EJB 3.1,直接针对 Narayana 进行编码是一种选择。JDBC驱动是ojdbc7-12.1.0.1,JMS RAR是MQ系列(不知道版本)。