在一段时间后重新连接到QueueManager时,在MQ客户端(C#)上获取错误原因代码2059

时间:2010-06-04 10:31:16

标签: c# .net ibm-mq

在构建MQQueueManager的新对象时,我在一段时间后无法重新连接到MQQueueManager作为异常(原因码 2059 - MQRC_Q_MGR_NOT_AVAILABLE)。我的客户端应用程序是用.NET / C#编写的,我在Win2003上运行它。

然而,在重新启动我的客户端应用程序后,我可以连接到QM。这表明QM库中的某些状态不正确?如何重置代码中的状态以便重新连接到QM?有没有办法从客户端应用程序代码重置/断开所有活动的TCP连接到QM?

我的连接代码:

    Hashtable properties = new Hashtable();
    properties.Add( MQC.HOST_NAME_PROPERTY, Host );
    properties.Add( MQC.PORT_PROPERTY, Port );
    properties.Add( MQC.USER_ID_PROPERTY, UserId );
    properties.Add( MQC.PASSWORD_PROPERTY, Password );
    properties.Add( MQC.CHANNEL_PROPERTY, ChannelName );
    properties.Add( MQC.TRANSPORT_PROPERTY, TransportType );
    // Following line throws an exception randomly
    MQQueueManager queueManager = new MQQueueManager( qmName, properties );

堆栈追踪:

    Source: amqmdnet
    CompletionCode: 2
    ReasonCode: 2059
    Reason: 2059
    Stack Trace:
     at IBM.WMQ.MQBase.throwNewMQException()
     at IBM.WMQ.MQQueueManager.Connect(String queueManagerName)
     at IBM.WMQ.MQQueueManager..ctor(String qmName, Hashtable properties)
     at WebSphereMQOutboundAdapter.WebSphereMQOutbound.ConnectToWebSphereMQ()

2 个答案:

答案 0 :(得分:2)

连接是每线程的,因此如果您在先前的QMgr对象仍然被实例化时尝试创建新连接,那么您将获得此连接。如果在创建新对象之前关闭先前的连接并销毁对象,则应该没问题。由于队列和其他WMQ对象依赖于连接句柄,因此还需要销毁这些对象,然后在建立新连接后重新实例化。

对于这种行为当然有一些其他解释,但这些不太可能。例如,通道出口或(在WMQ v7中)配置可能限制来自给定IP地址的同时连接的数量。当连接被切断而不是关闭时,保持QMgr侧连接的通道代理必须在QMgr看到连接关闭之前超时。如果连接限制到位,这些“重影”连接会减少可用池。但正如我所说,这远不如重新连接尝试之前没有清理旧对象的程序那么常见。

这也有可能是一个错误。为了减少这种可能性,并且出于各种其他原因,例如明年WMQ v6即将结束,我建议在客户端和服务器端使用WMQ v7.0.1.2进行此项目。通常,只要您坚持使用v6功能,就可以将v7.0.1.2客户端与v6.0.x服务器一起使用。除此之外,.Net代码更好地集成在v7中,而Cat-3 SupportPac现在包含在基本安装介质中,而不是单独下载。

答案 1 :(得分:1)

在与此问题和IBM支持人员争夺数月之后,我找到的最佳解决方案是更改IBM MQ Driver中的连接/断开代码。

不是为每个GET / PUT调用manager.Disconnect()和manager.Close(),只需连接一次然后重新连接,只要你有一些例外(如失去连接)。

我所知道的是,IBM MQ Driver中存在一些错误,它会为每个连接/断开连接缓存一些信息。当此缓冲区已满时,应用程序将停止重新连接。

驱动程序版本(客户端DLL' s)我遇到此问题的是:7.0.1.6