3

我使用以下代码从 MQQueue 和 MQQueueManager 断开连接:

队列.Close();
log.Info("队列 IsOpen:" + Queue.IsOpen.ToString());
队列=空;

QueueManager.Disconnect();
QueueManager.Close();
log.Info("QM IsOpen:" + QueueManager.IsOpen.ToString());
log.Info("QM IsConnected:" + QueueManager.IsConnected.ToString());
队列管理器 = 空;

我为此得到以下日志条目:

队列已打开:假
QM IsOpen:假
QM 已连接:错误

但是几个小时后,当我从命令提示符运行netstat -n命令时,我得到了一长串与 MQ 服务器的连接,并且这些连接中的状态是CLOSE_WAIT

任何想法为什么 TCP 连接没有完全关闭?有什么方法可以让我从代码中杀死它们吗?目前我将不得不重新启动清理打开连接的客户端应用程序。

WebSphere MQ 版本是 6.0.2.6,.NET 库来自 MQ 7。

4

1 回答 1

1

在 Migration Guide 中有一个名为将 WebSphere MQ 客户端从版本 6.0 升级到版本 7.0的部分,它提出了一个可能的解释。它指出,从 v7 开始,TCP 调整存储在客户端配置文件中。因此,如果您在 Windows 注册表中启用了 TCP Keepalive,v7 客户端将忽略它。WebSphere MQ 客户端配置文件中描述了该文件的格式和位置。

当然,要解决这个问题,就必须存在套接字泄漏。您没有提及您拥有哪个版本的 WMQ V7 客户端,但 Fix Pack README 文件确实显示了许多与套接字泄漏、断开连接后无法清理等相关的 APAR。这些都没有直接提到 C# 或 .Net,但是围绕连接/断开问题存在足够多的问题,值得升级。

因此,尝试的第一个也是最简单的解决方法是将 TCP Keepalive 添加到客户端配置文件中,看看它是否有帮助。当您在那里时也禁用连接共享。它不应该是一个因素,但也不应该泄漏套接字。伤不起。接下来是应用Fix Pack 7.0.1.2(撰写本文时的最新版本),看看是否能解决问题。之后,是 PMR 时间。希望有帮助。

于 2010-06-22T01:00:29.740 回答