【问题标题】:IBM Websphere MQ C# app - Reconnect after MQRC_Q_MGR_NOT_AVAILABLEIBM Websphere MQ C# 应用程序 - 在 MQRC_Q_MGR_NOT_AVAILABLE 之后重新连接
【发布时间】:2014-01-08 13:37:53
【问题描述】:

我遇到了与Getting error reason code 2059 on MQ client (C#) when reconnecting to QueueManager after awhile 帖子相同的问题。

这是一个间歇性问题。使用轮询与 MQ 连接和断开连接的服务器应用程序有时会收到 MQRC_Q_MGR_NOT_AVAILABLE。即使在每次轮询时创建新连接,应用程序也不会自动恢复。这是一个 C# 应用程序,使用标准 MQ .NET 库。

重启服务后,就可以正常使用了。通常这个问题每周半发生一次。

对于每次轮询,使用以下命令创建新连接:

manager = new IBM.WMQ.MQQueueManager(config.QueueManagerName);

IBM.WMQ.MQQueueManager 管理器实例存储在私有变量中,操作完成后关闭连接,调用

 manager.Disconnect();
 manager.Close();

我错过了什么吗?

我试图模拟这个问题,即使在 100.000 次连接和断开连接之后,它也没有发生 :-(

有什么猜测吗?

【问题讨论】:

    标签: c# ibm-mq mq


    【解决方案1】:

    尝试在调用 Disconnect 后使管理器对象无效。类似的东西

    manager.Disconnect();
    manager = null;
    

    【讨论】:

    • 啥时,我没有显式设置为null,但是,下次重连时,manager会被设置为MQQueueManager的新实例,这会导致旧引用被垃圾回收。跨度>
    • 我还注意到 IBM 类不实现 IDisposable。我不知道他们如何在内部管理自己的句柄。
    【解决方案2】:

    我在这个错误上与 IBM 合作了一段时间,但没有找到解决方案。每个人都同意存在问题,但他们的建议是首先将所有内容升级到 Websphere MQ 的较新版本,在我的场景中,由于内部基础架构过程,这需要很长时间。我无法确认升级是否能解决问题。

    我在这里的建议,尽管非常糟糕,但却是我对此的最佳答案。让您的进程创建一个新进程,该进程执行与队列有关的任何事情,并使用任何形式的进程间通信来获取结果。定期终止此进程,或在每次与队列交互时终止。

    会让您对自己的解决方案感到难过,但会为您节省大量的电子邮件流量和挫败感。

    【讨论】:

      猜你喜欢
      • 2012-03-09
      • 2015-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多