在关闭和断开 IBM MQ.NET 客户端时设置超时

Setting Timeout on Close and Disconnect IBM MQ.NET Client

是否可以为以下代码设置超时时间:

private MQQueueManager queueManager;
private MQQueue queue;

   ...
queue.Close();
queueManager.Disconnect();

原因是连接有时会在尝试关闭时卡住。线程在 Close() 或 Disconnect() 上阻塞。

更新

客户端使用托管客户端、CCDT 文件、集群队列管理器和其他可能导致不同设置的功能。

请提供代码示例。

我们能否通过如下 API 使用类似方法更改超时设置:

    int openOptions = Set possible settings here

    var properties = new Hashtable
    {
          Set possible settings here
    };

    _queueManager = new MQQueueManager(_queueManagerName, properties);
    _queue = _queueManager.AccessQueue(QUEUE_NAME, openOptions);

MQ 客户端和 MQ 服务器决定连接超时的方式是基于 运行 SVRCONN 通道的协商心跳 (HBINT) 值。协商的 HBINT 始终是 SVRCONN 和客户端应用程序之间协商的最高值。

注:SVRCONNHBINT的默认值为300

TIMEOUT 通过以下两种方式之一确定:

  1. 如果协商的 HBINT 小于 60,则超时为 2x HBINT
  2. 如果协商的 HBINT 大于或等于 60,则超时为 HBINT + 60。

特定于与 HBINT 相关的 .NET 客户端领域:

APAR IT26614 更正了以下三个问题:

  1. 在非托管或托管模式下,如果您不使用 CCDT,则 HBINT 将使用 SVRCONN 通道的值。实际上,如果不使用 CCDT,客户端的 HBINT 默认为 300,因此这是您将看到的最低 HBINT

  2. 特定于 Managed .NET 客户端 HBINT 不能低于 SVRCONN HBINT 连接将失败并显示 2059。此问题影响两者有或没有 CCDT。

    • 使用 CCDT,您无法将 CLNTCONN HBINT 设置为小于 SVRCONN HBINT
    • 的值
    • 没有 CCDT 如果 SVRCONN HBINT 设置为 301 或更高,您将受到影响
  3. 特定于托管 .NET,客户端接收超时是以毫秒而不是秒为单位计算的。在这种情况下,根据 IBM 的说法,该缺陷已经存在很长时间了,但直到在 8.0.0.10 和 9.0.0.4 中引入 APAR IT16167: Managed .NET client application does not send heartbeat request to queue manager 之后才出现(IBM 还确认这在 GA 9.1.0.0 中存在).以前不是问题的原因是 Managed .NET 从未启动心跳,队列管理器总是在 HBINT + 5 秒发送心跳,.NET 客户端会响应。更正此问题后,接收超时的计算错误就出现了。

The fix is targeted for delivery in the following PTFs:

Version    Maintenance Level
v8.0       8.0.0.13
v9.0 LTS   9.0.0.7
v9.1 CD    9.1.3
v9.1 LTS   9.1.0.3

截至 2019 年 7 月 12 日,仅发布了 9.0.0.7 和 9.1.3,可从以下位置下载:


除非您使用的是包含上述 APAR 的 amqmdnet.dll 版本,或者您要求 IBM 为您提供任何较低版本的 IFIX,否则实现低于 300 HBINT 的唯一方法是需要SVRCONN HBINT 与使用 CCDT 的客户端一起设置为较低的值,CLNTCONN HBINT 设置为较低的值。基于非托管或托管 .NET,您有两个选择:

  1. 使用非托管 .NET,您可以将 CLNTCONN HBINT 设置为 1 并允许客户端始终协商到 SVRCONN HBINT价值。然后您需要 MQ 管理员将 SVRCONN HBINT 设置为所需的值。
  2. 使用 Managed .NET,您需要 MQ 管理员将 SVRCONN HBINT 设置为所需的值,然后您需要设置 CCDT CLNTCONN HBINTSVRCONN HBINT.
  3. 相同的值

如果您正在使用包含上述 APAR 的 amqmdnet.dll 版本,或者您要求 IBM 为您提供任何较低版本的 IFIX,则工作原理如下:

  1. 如果不使用 CCDT,客户端将使用 HBINT(1) 的等价物,并将协商达到 SVRCONN 值。
  2. 如果使用 CCDT,CLNTCONN 可以将 HBINT 设置为 1,这会在不使用 CCDT 时产生与上述相同的行为,HBINT 将协商达到 SVRCONN 值。

无论是使用 CLNTCONN HBINT 设置为 1 的 CCDT 还是不使用客户端将使用 HBINT(1) 的 CCDT,您都需要询问MQ 管理员将 SVRCONN HBINT 设置为较低的值以实现更短的超时。


在 CCDT CLNTCONN 通道上设置 HBINT 的示例:

DEFINE CHL(CLIENT_CHL) CHLTYPE(CLNTCONN) CONNAME('1.2.3.4(9999)') QMNAME(ABC) HBINT(1)