如果队列管理器不可用且使用了事务,MQQueueManager构造函数将挂起

时间:2010-08-13 00:12:03

标签: c# transactions ibm-mq

我遇到一个问题,如果队列管理器关闭,调用MQQueueManager构造函数就会挂起。

当我将构造函数调用到MQQueueManager时,我使用EnterpriseOptions.Full打开了TransactionScope。如果MQ虽然关闭(或者可能在QM关闭时尝试连接),则此调用将挂起。即使事务到期,它也不会在事务中引发超时异常。

如果我在进行连接时没有打开事务范围,那么在此之后我永远无法让MQQueueManager参与事务。

所以,如果MQ可以关闭(它确实......),当我建立连接时,如何阻止队列挂起。我正在使用MQ 6.0.2.5中的Managed客户端。

我添加了一些代码以使问题更清晰:

TransactionOptions opt = new TransactionOptions();
opt.IsolationLevel = IsolationLevel.Serializable;
opt.Timeout = new TimeSpan(0, 0, 20);
TransactionScopeOption ScopeOption = TransactionScopeOption.Required;

using (TransactionScope tran = 
    new TransactionScope
        (ScopeOption, 
        opt, 
        EnterpriseServicesInteropOption.Full))
{
    //This line hangs if MQ is down, doesn't backout or throw a 2059.
    var m_qMgr = new MQQueueManager(QueueManager, Channel, Hostname);
    tran.Complete();
}

2 个答案:

答案 0 :(得分:1)

MQQueueManager构造函数具有一个接受HashTable属性的重载。根据我的经验,从.NET应用程序调用MQ时,需要将TRANSPORT_PROPERTY设置为TRANSPORT_MQSERIES_MANAGED。

e.g。

 // set up the connection settings for the queue manager.
 var settings = new Hashtable {{MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_MANAGED}};
 var qm = new MQQueueManager("yourQueueManagerName", settings);

您可以找到有关此属性的更多信息here

我希望这会有所帮助。我非常清楚与MQ战斗的痛苦。

答案 1 :(得分:1)

我看到悬挂的两种可能性。一个是它低于WMQ,另一个是WMQ代码可能有一个未处理的异常。让我们看看这两个。

假设TCP正在尝试构建套接字,为什么WMQ启动但不会停止时它会起作用?一个答案是,在QMgr出现故障后,WMQ听众仍然保持警惕。在这种情况下,侦听器接受套接字但没有任何东西可以将其移交给。如果侦听器是使用runmqlsr而不是作为QMgr侦听器对象启动的,则这很常见。如果使用inetd作为监听器,这几乎是不可避免的。您没有在QMgr方面提及该版本。什么版本的WMQ以及监听器是如何启动的?运行QMgr的平台是什么?

我正在考虑的第二种可能性是配置与选项不匹配。 WMQ将在任何客户端安装时执行单阶段提交,但您要求它做的是与Windows协调作为事务控制器。在客户端模式下,需要扩展事务客户端(a.k.a. XTC)。 XTC组件是WMQ Server安装的一部分,实际上是许可为WMQ Server。换句话说,如果您在Windows主机上支付WMQ服务器,那么您有权在那里安装完整的WMQ服务器和/或XTC组件。 XTC组件提供mqic32xa.dll,它通过WMQ客户端连接提供XA事务性。

很多时候,不了解许可影响的人会抓住XA dll或Java / JMS XA类并将其放到WMQ客户端安装中。如果未使用WMQ Server媒体安装XA类,则可能会导致不可预测的结果,例如您所看到的结果。如果XA支持文件和WMQ客户端安装处于不同的修订包级别或更糟糕的是不同版本,则尤其如此。

如何在Windows服务器中安装XA支持?如果少于WMQ Server媒体,则可能安装无效。在任何情况下,建议使用最新的Fix Pack,因为此时6.0.2.5已经很老了。 v6.0.2.9的修订列表包含几个与.Net相关的APAR,包括IZ54336,其中包含“在托管.NET应用程序的mqconn尝试期间在服务器上观察到的AMQ9456协议错误和客户端上的2018 hconn错误。”

要为您的应用程序正确安装WMQ,禁止的方法是获取WMQ v7.0 Server媒体并从中安装WMQ客户端。选择Extended Transactional Client进行安装。完成后,再应用最新的Fix Pack。 .Net类已在v7中集成到WMQ基础产品中,并得到完全支持。使用服务器介质可在安装客户端时提供XA支持。除了v7是一个更好的.Net实现,v6是12个月内的生命周期结束,所以现在使用v7将使你免于转换或失去支持。 v7客户端与v6 QMgr兼容,但当然没有新的v7功能。

您可以从v6服务器媒体执行大致相同的操作,但请确保安装最新的Fix Pack以获得已应用的所有.Net修复程序的好处。服务流中还提供了一些新的v7功能,因此您也可以获得这些功能。

您可以在http://bit.ly/WMQTrial下载WMQ Server试用版 您可以在http://bit.ly/WMQFixes

下载最新的修订包
相关问题