首页
学习
活动
专区
圈层
工具
发布

JMS事务
EN

Stack Overflow用户
提问于 2012-12-15 07:23:59
回答 2查看 8.8K关注 0票数 7

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

代码语言:javascript
复制
try {
  ...
  ..
  updateDB()
  ..
  ...
  commit();
} catch error {
  rollback();
}

如果发生任何错误,updateDB所做的任何更改都将被丢弃。

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

代码语言:javascript
复制
try{
  ...
  ...
  //EDIT: swapped the order of receive and send
  Message m = queue1.receiveMessage(..)
  ..
  ..
  queue2.sendMessage(..)
  ..
  ..
  commit();
} catch error {
  rollback();
}

具体来说,回滚将做什么?

  1. 取消消息的发送
  2. 不接收消息(将接收的消息放回队列中)

还是我把数据库的tx类比拉得太远了。

谢谢

编辑:我没有暗示发送和接收操作是相关的。我只想说,有两个操作可以更改message的状态-- receive将从队列中取出一条消息,如果有其他用户的话,该消息将不可用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-15 09:59:42

回滚的发送是直接的,该消息将不会被放入queue2。

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

票数 11
EN

Stack Overflow用户

发布于 2012-12-15 07:27:23

是的,你把它拉得太长了。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13890287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档