2014-01-17 37 views
2

我是相当新的XA和非XA的世界。我的要求是从队列中读取消息,直到出现NO消息。对于队列中的每条消息,转到数据库并执行一些事务,如选择,插入,更新。XA或非XA的JMS和DB操作

这是可能实现这一目标使用非XA数据源?我目前正在使用XA数据源,但了解到它的成本很高,性能受到影响。

感谢任何帮助!由于

+0

你应该解释一下如何管理队列,使用什么产品。一些数据库供应商还提供排队解决方案,这将使您的生活更轻松。 – steve

回答

3

如果您需要在您的交易,包括与JMS连接双方交互(即发送或接收信息),并与数据库连接,通过使用数据库连接那么你一定需要一个XA-数据源因为您的交易是two-phase commit (2PC) transaction

在两阶段提交事务你要么更改提交到所有的资源(在你的情况JMS和DB资源),或者,如果出现错误与其中一方回滚所有更改。

要做到这一点,您需要连接到已启用XA的数据源。 此外,在Java EE容器中,JMS连接应已启用XA-

0

XA保证一个消息匹配1和仅1 DB事务。 让我们觉得发生没有XA(只是众多可能的情况之一):

  1. 的MDB挑一条消息
  2. 的MDB执行DB工作(让我们说,每一件事情去了,不例外)
  3. 应用服务器的JDK崩溃出于某种原因或出现网络故障,而MDB线程仍在运行
  4. 为了简单起见,让我们考虑的是,重新启动服务器:由于MDB没有提交事务,为此消息仍在队列中。
  5. 另一个MDB获取消息并重复数据库事务。

对于我们的幸运,XA存在! :-) 从表演角度来看,付费是有成本的,但总是质量(服务)有成本!

+0

您在这里做了几个假设,这些假设不一定是正确的:数据库和排队系统都必须支持XA协议。 – steve

+0

这些假设是在问题中。他说他可以在XA数据源和非XA之间进行选择,但他担心表演。 WebSphere Messaging确实支持XA,这是J2EE规范的要求。我只展示了XA如何提供帮助的例子。 – dmarrazzo

2

考虑1.5 phase commit。基本上是:

  • 第1步:您提交DB交易
  • 第2步:您提交JMS事务。

可能的错误情况:

  1. DB事务失败。
  2. 数据库事务成功的JMS事务失败。
  3. 全部成功。

不是1或3会使您的系统处于不一致的状态。如果是1,则只需重新发送消息。

要处理方案2,您需要向系统引入重复检查。所以基本上您的交易管理看起来像类似于这样:

//pseudo code 
if (isDublicate(message)) 
    commitJMSTransaction(); 
else 
    doYourBusinessLogic(); 
    doYourDBOperation(); 
    commitDBTransaction(); 
    commitJMSTransaction(); 

如果JMS交易失败的消息代理将重新尝试发送邮件(或者你需要重新发送手动取决于你的经纪人设置),但你复制检查将检测到它并将其从队列中删除。

+0

感谢您的链接! – rbp

2

为了给你一个XA和NON-XA转换的想法,我简要解释一下, XA事务是一个“全局事务”。 非XA交易是“本地交易”。

XA事务涉及协调事务管理器,一个或多个数据库(或其他资源,如JMS)都参与单个全局事务。如果它连接到多个数据库,那么它是XA。

非XA事务没有事务协调器,并且单个资源正在完成其所有事务工作本身。这将只有一个数据库作为资源。