我是XA和非XA世界的新手。我的要求是从队列中读取消息,直到没有消息为止。对于队列中的每条消息,转到DB并执行一些事务,如select、insert、update。
是否可以使用非XA数据源来实现这一点?我目前正在使用XA数据源,但了解到它的成本很高,性能也会受到影响。
感谢您的帮助!谢谢
发布于 2014-01-17 21:30:27
如果您需要在您的事务中包含与JMS connection的交互(例如,发送或接收消息)以及通过使用db connection与数据库连接,那么您肯定需要一个XA数据源,因为您的事务是一个。
在两阶段提交事务中,您要么提交对所有资源(在本例中为JMS和DB资源)的更改,要么在其中任何一个资源出现问题时回滚所有更改。
为此,您需要连接到支持XA的数据源。此外,在Java容器中,JMS连接应该已经是支持XA的。
发布于 2015-09-29 01:35:12
以1.5 phase commit为例。基本上:
JMS第一步:提交DB transaction
可能的错误场景:
不是1,也不是3会使系统处于不一致的状态。如果是1,只需要重新发送消息即可。
要处理场景2,您需要在系统中引入重复检查。因此,从本质上讲,您的事务管理将类似于以下内容:
//pseudo code
if (isDublicate(message))
commitJMSTransaction();
else
doYourBusinessLogic();
doYourDBOperation();
commitDBTransaction();
commitJMSTransaction();如果JMS事务失败,您的message broker将重新尝试发送消息(或者您需要手动重新发送它,这取决于您的代理设置),但是您的重复检查将检测到该消息并将其从队列中删除。
发布于 2016-06-01 21:50:57
为了让您对XA和非XA事务有一个概念,我简要地解释一下,XA事务是一个“全局事务”。非XA事务是“本地事务”。
一个XA事务涉及一个协调事务管理器,一个或多个数据库(或其他资源,如JMS)都包含在单个全局事务中。如果它连接到多个数据库,那么它就是XA。
非XA事务没有事务协调器,所有事务工作都由单个资源自己完成。这将只有一个数据库作为资源。
https://stackoverflow.com/questions/21182623
复制相似问题