【问题标题】:JMS rollbackJMS 回滚
【发布时间】:2023-03-23 16:05:01
【问题描述】:

我有一个涉及发送 JMS 消息的过程。 该过程是交易的一部分。 如果事务的后一部分失败,即在发送消息的前一部分之后的部分,我需要取消该消息。 我的一个想法是以某种方式设置消息在一定时间内不会被拾取,如果我需要回滚,那么我可以去取消消息。 不知道消息传递,我不知道这个想法是否可行。 或者,有更好的主意吗? 谢谢

【问题讨论】:

    标签: jms rollback


    【解决方案1】:

    您可以同时使用 JMS 和 JTA(Java 事务 API)。这样做时,JMS 消息的发送或接收到的消息的消费实际上是作为事务提交的一部分自动发生的。

    这是什么意思?如果事务失败或回滚,则“已发送”消息不会发出,任何“已接收”消息都不会真正被消费。一切都由您的 JMS 和 JTA 提供商为您处理。

    您需要使用支持 JTA 的 JMS 实现。听起来您已经在使用事务了,所以可能需要做一些配置来实现它(大力挥手......)。

    我曾经使用过这个(BEA WebLogic 7 w/BEA WebLogic Integration)。像宣传的那样工作——“外部世界”没有看到我尝试过的 JMS 东西的影响,除非事务成功提交。

    此版本的早期版本链接到一般描述 JMS/JTA 集成的 Java 页面。该页面已过时,我没有看到等效的替代品。此javadoc 用于与此功能相关的 JMS 接口。

    【讨论】:

      【解决方案2】:

      您所描述的是 XA 事务。这允许事务跨越多个层,即 JMS 提供程序、DB 或任何其他 EIS。大多数容器都可以配置为使用非 XA 和非 XA 事务,因此请检查您的容器设置!

      例如,如果您将 JMS 与 XA 事务一起使用,则以下是可能的。

      Start Transaction
            |
         DB Insert
            |
         Send JMS Msg
            |
         More DB Inserts
            | 
         Commit Transaction  <- Only at this point will the database records be inserted and the JMS message sent.
      

      XA 事务仅在完整的 Java EE 容器中可用,因此 XA 事务在 Tomcat 中不可用。

      祝你好运!

      卡尔

      【讨论】:

      猜你喜欢
      • 2011-11-14
      • 1970-01-01
      • 2013-11-24
      • 2015-02-25
      • 1970-01-01
      • 2011-11-05
      • 1970-01-01
      • 1970-01-01
      • 2021-03-07
      相关资源
      最近更新 更多