代码之家  ›  专栏  ›  技术社区  ›  Tommi L.

当使用C客户机从WebSphere MQ断开连接时,TCP连接仍处于关闭等待状态

  •  3
  • Tommi L.  · 技术社区  · 15 年前

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

    Queue.Close();
    log.Info( "Queue IsOpen: " + Queue.IsOpen.ToString() );
    Queue = null;
    
    QueueManager.Disconnect();
    QueueManager.Close();
    log.Info( "QM IsOpen: " + QueueManager.IsOpen.ToString() );
    log.Info( "QM IsConnected: " + QueueManager.IsConnected.ToString() );
    QueueManager = null;
    

    我得到以下日志条目:

    Queue IsOpen: false
    QM IsOpen: false
    QM IsConnected: false
    

    但几小时后我跑步 NETSTAT-N 来自命令提示符的命令我得到一个到MQ服务器的连接的长列表,这些连接中的状态是 关闭等待 .

    你知道为什么TCP连接不能完全关闭吗?有什么方法可以从代码中杀死它们吗?目前,我必须重新启动客户端应用程序来清理打开的连接。

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

    1 回复  |  直到 15 年前
        1
  •  1
  •   T.Rob    15 年前

    在迁移指南中有一节叫做 Upgrading a WebSphere MQ client from Version 6.0 to Version 7.0 这表明了一个可能的解释。它指出,从V7开始,TCP调优就存储在客户机配置文件中。因此,如果您在Windows注册表中启用了tcp keepalive,v7客户机将忽略它。文件的格式和位置在 WebSphere MQ client configuration file .

    当然,要解决这个问题,必须有一个套接字泄漏。您没有提到您拥有的WMQV7客户机的哪个版本,但是修复包自述文件确实显示了许多与套接字泄漏、断开连接后无法清理等相关的APAR。这些都没有直接提到C或.NET,但是在连接/断开问题上有足够的问题使其值得升级。

    因此,最容易尝试的修复方法是将tcp keepalive添加到客户机配置文件中,并查看它是否有帮助。在那里时也禁用连接共享。这不应该是一个因素,但也不应该泄漏插座。不会伤害的。接下来是申请 Fix Pack 7.0.1.2 (这篇文章的最新版本)看看是否解决了问题。之后,就是PMR时间了。希望有帮助。

    推荐文章