JMS事务

mzz*_*zzb 6 transactions jms message-queue

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

try {
  ...
  ..
  updateDB()
  ..
  ...
  commit();
} catch error {
  rollback();
}
Run Code Online (Sandbox Code Playgroud)

如果发生任何错误,则将丢弃updateDB所做的任何更改.

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

try{
  ...
  ...
  //EDIT: swapped the order of receive and send
  Message m = queue1.receiveMessage(..)
  ..
  ..
  queue2.sendMessage(..)
  ..
  ..
  commit();
} catch error {
  rollback();
}
Run Code Online (Sandbox Code Playgroud)

具体来说,回滚会做什么

  1. 取消发送消息
  2. 取消接收消息,即将收到的消息放回队列

或者我是将数据库tx拉得太过分了.

谢谢

编辑:我并不是暗示发送和接收操作是相关的.我只是想说有两个操作可以改变消息代理的状态 - 接收将从队列中取出一条消息,如果有的话,它将对其他消费者不可用.

Pet*_*der 10

回滚的发送是直接的,消息不会被放到queue2.

回滚接收通常会将消息放回队列(queue1).根据您的JMS提供程序设置和配置,将重新传递消息.如果事务回滚太多次(太多可配置),它将被置于"回退队列"(或死信队列),这样它就不会阻塞其他消息的队列.退出的消息通常需要一些手动错误处理.