8

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

4

2 回答 2

10

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

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

您需要使用支持 JTA 的 JMS 实现。听起来您已经在使用事务,因此可能需要进行一些配置以使其发生(大力挥手......)。

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

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

于 2009-02-06T18:13:35.297 回答
10

您所描述的是 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 中不可用。

祝你好运!

卡尔

于 2009-02-16T20:35:21.447 回答