【问题标题】:Getting error reason code 2059 on MQ client (C#) when reconnecting to QueueManager after awhile一段时间后重新连接到 QueueManager 时,在 MQ 客户端(C#)上出现错误原因代码 2059
【发布时间】:2010-06-04 10:31:16
【问题描述】:

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

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

我的连接代码:

 Hashtable 属性 = 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()

【问题讨论】:

    标签: c# .net ibm-mq


    【解决方案1】:

    连接是每个线程的,因此如果您在前一个 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 现在包含在基本安装媒体中,而不是单独下载。

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 你能检查一下最新的补丁包 7.0.1.12 吗?此修复 - www-01.ibm.com/support/docview.wss?rs=171&uid=swg1IC97860 可能会解决您的问题。
      • 在我的程序中,我也连接一次,然后仅在发生异常时重新连接.. 但是你知道我是否必须在错误处理中调用 .Disconnect() 或者 isConnected 变量是否自动设置为false 和 MQ 断开连接?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-06
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      • 2019-03-17
      相关资源
      最近更新 更多