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提供程序的设置和配置,消息将被重新传递多次。如果事务回滚次数太多(太多是可配置的),它将被放入“回退队列”(或死信队列),这样它就不会阻止其他消息的队列。已备份的邮件通常需要一些手动错误处理。感谢您的见解。但我并不是在暗示我在等待发送消息的回复,只是想指出状态的两个变化。我已对我的问题进行了澄清,并交换了接收/发送消息的顺序。