2

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

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

我的连接代码:

    哈希表属性 = new Hashtable();
    properties.Add(MQC.HOST_NAME_PROPERTY, 主机);
    properties.Add(MQC.PORT_PROPERTY, 端口);
    properties.Add(MQC.USER_ID_PROPERTY, UserId);
    properties.Add(MQC.PASSWORD_PROPERTY, 密码);
    properties.Add(MQC.CHANNEL_PROPERTY, ChannelName);
    properties.Add(MQC.TRANSPORT_PROPERTY, TransportType);
    // 下面一行随机抛出异常
    MQQueueManager queueManager = new MQQueueManager(qmName, properties);

堆栈跟踪:

    资料来源:amqmdnet
    完成代码:2
    原因代码:2059
    原因:2059
    堆栈跟踪:
     在 IBM.WMQ.MQBase.throwNewMQException()
     在 IBM.WMQ.MQQueueManager.Connect(字符串 queueManagerName)
     在 IBM.WMQ.MQQueueManager..ctor(字符串 qmName,哈希表属性)
     在 WebSphereMQOutboundAdapter.WebSphereMQOutbound.ConnectToWebSphereMQ()
4

2 回答 2

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 SupportPacs 现在包含在基本安装媒体中,而不是单独下载。

于 2010-06-04T11:28:27.367 回答
1

在与这个问题和 IBM 支持斗争了几个月后,我发现最好的解决方案是更改 IBM MQ 驱动程序中的连接/断开代码。

不要为每个 GET/PUT 调用 manager.Disconnect() 和 manager.Close(),而是连接一次,然后仅在出现异常(例如丢失连接)时重新连接。

我发现 IBM MQ 驱动程序中存在一些错误,它为每个连接/断开连接缓存一些信息。当此缓冲区已满时,应用程序将停止重新连接。

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

于 2014-07-14T11:57:01.670 回答