我有一个涉及发送JMS消息的过程.该过程是交易的一部分.如果事务的后续部分失败,发送消息的前一部分之后的部分,我需要取消该消息.有一种想法是以某种方式设置消息,它不会被捡起一段时间,如果我需要回滚,那么我可以去取消消息.不知道消息,我不知道这个想法是否可行.或者,有更好的主意吗?谢谢
您所描述的是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 Tranactions仅在完整的Java EE容器中可用,因此Tomcat中不提供XA事务.
祝好运!
卡尔
您可以一起使用JMS和JTA(Java Transaction API) - 请参阅此处.这样做时,JMS消息的发送或接收消息的消耗实际上是作为事务提交的一部分原子地发生的.
这是什么意思?如果事务失败或回滚,则"已发送"消息不会消失,并且不会真正消耗任何"已接收"消息.所有由JMS和JTA提供商为您处理.
您需要使用支持JTA的JMS实现.听起来你已经在使用交易了,所以可能需要做一些配置来实现它(大力挥手......).
我有使用它的经验(BEA WebLogic 7 w/BEA WebLogic Integration).按照宣传的方式工作 - "外部世界"没有看到我试过的JMS的影响,除非事务成功完成.