3

我们有一个我们认为是相当常见的 XA 用例:

  1. 从队列中读取消息
  2. 将一些数据写入数据库
  3. 将响应消息写入出队(与入队不同)

然而,我们还需要一种方法来处理内部错误和有害消息。我们想到的控制流是这样的:

  1. 从队列中读取消息
  2. 写入数据库
    • 如果有异常回滚数据库事务
    • 如果没有异常在数据库上运行 commit phase1
  3. 如果一切顺利(没有回滚和提交阶段 1 ok),则向 out-queue 写入成功消息
  4. 如果数据库上的提交阶段 1 失败或出现异常并且数据库事务已回滚,则将失败消息写入出队列
  5. 提交 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系列(不知道版本)。

4

1 回答 1

2

您可以做的是使用 Java EE 事件机制在事务失败时获取通知并创建后续输出消息。

您需要使用新事务写入出队列以避免回滚消息写入。

您仍然会在导致异常的输入队列中保留消息,因为回滚将阻止成功消费。您需要单独处理,例如由 JMS 提供程序处理。

于 2013-10-15T08:58:13.333 回答