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

Posted

技术标签:

【中文标题】Websphere MQ 作为 txn 协调器:- 由于 db2 无法启动 xa,MQ.begin() 在 mq 退出后失败【英文标题】:Websphere MQ as txn coordinator:- MQ.begin() fails after mq backout due to db2 not able to start xa 【发布时间】:2014-10-31 10:31:05 【问题描述】:
Environment details:-
    Websphere MQ:- Redhat Linux 6.4 上的 7.5.0.2 IBM DB2:- Redhat Linux 6.4 上的 10.1.0.2 Java 1.7 Java 的 Websphere MQ 类 MQ 作为事务协调器

Scenario:-

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

    qm.begin 获取消息并处理消息 qm.commit qm.begin 获取消息并在消息处理期间引发异常 qm.backout qm.begin(此操作失败并出现 MQJE001:完成代码 '2',原因 '2009'。

队列管理器的错误日志显示

AMQ7605:XA 资源管理器“dbname”在调用 xa_start 时返回了意外的返回码 -6

有谁知道出了什么问题?


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

这是否意味着事务回滚后,被撤销的uow中使用的连接不能被重用?还是我们遗漏了什么?

谢谢, 维巴夫

【问题讨论】:

有人可以帮忙吗? 【参考方案1】:

您粘贴的 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 来为您调查问题并给出正式回复。

【讨论】:

感谢蒂姆的回复。是的,我们已经联系了 IBM MQ。【参考方案2】:

已通过将 DB2XADataSource 的 supportsAsynchronousXARollback 标志设置为 true 解决了这个问题。

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

希望这对其他人也有帮助。

【讨论】:

以上是关于Websphere MQ 作为 txn 协调器:- 由于 db2 无法启动 xa,MQ.begin() 在 mq 退出后失败的主要内容,如果未能解决你的问题,请参考以下文章

WebSphere MQ消息通道管理总结

第十二章 IBM WebSphere MQ检索邮件

IBM websphere MQ 消息发送与获取

WebSphere MQ 配置问题

IBM Websphere MQ 基本实验操作

从 WebSphere 8 运行 Java 8 MQ 应用程序时出错