使用C#客户端断开与WebSphere MQ的连接时,TCP连接仍处于CLOSE_WAIT状态

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

 Queue.Close();  log.Info(“Queue IsOpen:”+ Queue.IsOpen.ToString()); 队列= null;  QueueManager.Disconnect();  QueueManager.Close();  log.Info(“QM IsOpen:”+ QueueManager.IsOpen.ToString());  log.Info(“QM IsConnected:”+ QueueManager.IsConnected.ToString());  QueueManager = null; 

我得到以下日志条目:

队列IsOpen:false
 QM IsOpen:false
 QM IsConnected:false

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

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

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

查看迁移指南,其中有一个名为将WebSphere MQ客户端从V6.0升级到V7.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时间。 希望有所帮助。