Transactions JMS事务

Transactions JMS事务,transactions,jms,message-queue,Transactions,Jms,Message Queue,数据库事务是一个熟悉的概念 try { ... .. updateDB() .. ... commit(); } catch error { rollback(); } 如果发生任何错误,updateDB所做的任何更改都将被丢弃 我想知道消息队列事务回滚将撤消什么 try{ ... ... //EDIT: swapped the order of receive and send Message m = queue1.receiveMessage(.

数据库事务是一个熟悉的概念

try {
  ...
  ..
  updateDB()
  ..
  ...
  commit();
} catch error {
  rollback();
}
如果发生任何错误,updateDB所做的任何更改都将被丢弃

我想知道消息队列事务回滚将撤消什么

try{
  ...
  ...
  //EDIT: swapped the order of receive and send
  Message m = queue1.receiveMessage(..)
  ..
  ..
  queue2.sendMessage(..)
  ..
  ..
  commit();
} catch error {
  rollback();
}
具体来说,回滚将做什么

  • 取消发送邮件
  • 取消接收信息(将收到的信息放回原处) 消息返回到队列
  • 还是我把数据库的类比做得太过分了

    谢谢


    编辑:我不是说发送和接收操作是相关的。我只是想说,有两个操作可以改变MessageBroker的状态——receive将从队列中取出一条消息,如果存在其他消费者,则该消息将不可用

    是的,你把它拉得太远了

    在事务处理模式下,您的
    队列.receiveMessage()
    将永远不会返回(假设它被设置为等待特定的回复消息,而不仅仅是“任何”消息),这仅仅是因为
    队列.sendMessage()
    尚未真正发送消息(在提交事务时将发送消息)


    顺便说一句,这是一个常见的错误。当使用JMS(异步协议)进行同步通信时,很自然地会将发送/接收周期视为由一个事务组成。然而,事实并非如此。一旦在事务处理模式下发出
    sendMessage()
    ,实际上什么都没有发生;只有在提交事务时才会发送消息。

    发送的回滚是直接进行的,消息不会放入队列2

    接收的回滚通常会将消息放回队列(queue1)。
    根据JMS提供程序的设置和配置,消息将被重新传递多次。如果事务回滚次数太多(太多是可配置的),它将被放入“回退队列”(或死信队列),这样它就不会阻止其他消息的队列。已备份的邮件通常需要一些手动错误处理。

    感谢您的见解。但我并不是在暗示我在等待发送消息的回复,只是想指出状态的两个变化。我已对我的问题进行了澄清,并交换了接收/发送消息的顺序。