数据库事务是一个熟悉的概念。
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();
}具体来说,回滚将做什么?
还是我把数据库的tx类比拉得太远了。
谢谢
编辑:我没有暗示发送和接收操作是相关的。我只想说,有两个操作可以更改message的状态-- receive将从队列中取出一条消息,如果有其他用户的话,该消息将不可用。
发布于 2012-12-15 09:59:42
回滚的发送是直接的,该消息将不会被放入queue2。
接收的回滚通常会将消息重新放到队列(queue1)上。根据JMS提供程序的设置和配置,将多次重新传递消息。如果事务回滚太多次(太多是可配置的),它将被放入一个“回退队列”(或死信队列),这样它就不会阻塞其他消息的队列。回退消息通常需要一些手动错误处理。
发布于 2012-12-15 07:27:23
是的,你把它拉得太长了。
在事务处理模式下,您的queue.receiveMessage()将永远不会返回(假设它被设置为等待特定的回复消息,而不仅仅是“任何”消息),仅仅因为queue.sendMessage()还没有真正发送消息(当事务提交时将发送消息)。
顺便说一句,这是一个常见的错误。当使用JMS (异步协议)进行同步通信时,很自然地将发送/接收周期看作是由一个事务组成的。然而,情况并非如此。在事务处理模式下发出sendMessage()之后,什么都不会发生;只有在事务提交时才会发送消息。
https://stackoverflow.com/questions/13890287
复制相似问题