Websphere MQ作为txn协调器: - 由于db2无法启动xa,因此mq回退后MQ.begin()失败

时间:2014-10-31 10:31:06

标签: java db2 ibm-mq xa

Environment details:-
  1. Websphere MQ: - Redhat Linux 6.4上的 - 7.5.0.2
  2. IBM DB2: - Redhat Linux 6.4上的 - 10.1.0.2
  3. Java 1.7
  4. 适用于Java的Websphere MQ类
  5. MQ as trasnaction coordinator

  6. Scenario:-
    

    以下所有步骤都在同一个线程上执行。数据库连接打开并保持打开,以便在线程上完成所有UoW。

    1. qm.begin
    2. 获取消息并处理消息
    3. qm.commit
    4. qm.begin
    5. 在邮件处理过程中抛出了消息和异常
    6. qm.backout
    7. qm.begin(这失败了MQJE001:完成代码'2',原因'2009'。
    8. 队列管理器的错误日志显示

      AMQ7605:XA资源管理器“dbname”在调用xa_start

      时返回了意外的返回码-6

      有谁知道出了什么问题?


      如果我们在每次提交或回滚后重复上述场景中的步骤并关闭数据库连接,那么一切正常。但是,这意味着我们必须打开和关闭每个事务的连接,这可能会影响性能。

      这是否意味着在回滚事务之后,在退出的uow中使用的连接无法重用?或者我们错过了什么?

      谢谢, Vaibhav

2 个答案:

答案 0 :(得分:0)

您粘贴的AMQ7605错误显示返回码-6。这是一个XA返回码,其详细信息可以在XA规范中找到:

http://pubs.opengroup.org/onlinepubs/009680699/toc.pdf

在第24页,您将找到-6:

的定义

#define XAER_PROTO -6 / *例程在不正确的上下文中调用* /

在这种情况下,这意味着当MQ(事务管理器)在数据库(资源管理器)上调用xa_open时,数据库拒绝了尝试声明它违反了XA协议。

我猜想MQ没有做正确的事情,或者数据库无效地抱怨这次尝试。无论哪种方式,我都建议在IBM MQ上打开PMR,为您调查问题并给出正式回复。

答案 1 :(得分:0)

通过将DB2XADataSource的supportsAsynchronousXARollback标志设置为true来解决此问题。

final DB2XADataSource dataSource = new DB2XADataSource();
dataSource.setsupportsAsynchronousXARollback(DB2BaseDataSource.YES);
...
...

希望这也有助于其他人。