【问题标题】:EJBs, XA transactions and error handlingEJB、XA 事务和错误处理
【发布时间】:2013-10-15 16:58:13
【问题描述】:

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

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

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

  1. 从队列中读取消息
  2. 写入数据库
    • 如果出现异常回滚数据库事务
    • 如果没有异常在数据库上运行 commit phase1
  3. 如果一切顺利(没有回滚和提交阶段 1 ok),则向 out-queue 写入成功消息
  4. 如果数据库上的提交阶段 1 失败或出现异常并且数据库事务已回滚,则将失败消息写入出队列
  5. 提交入队、出队和数据库(除非因为异常而滚动)

这是一个好方法吗,我们应该采取不同的做法吗?我们如何使用 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


【解决方案1】:

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

你需要使用一个新的事务来写入out queue,以避免回滚消息写入。

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

【讨论】:

  • 第一个链接失效
猜你喜欢
  • 2012-12-31
  • 1970-01-01
  • 2012-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-05
  • 2011-09-07
相关资源
最近更新 更多