【问题标题】:Setting Timeout on Close and Disconnect IBM MQ.NET Client在关闭和断开连接 IBM MQ.NET 客户端时设置超时
【发布时间】:2019-07-13 04:24:10
【问题描述】:

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

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);

【问题讨论】:

  • 将其他超时问题的内容合并到此问题中后,我将提供上述详细信息的答案,并在适用的情况下参考 KC 页面。
  • @JoshMc 感谢您的信息。一旦解决了这个问题,我将关闭另一个。您能否提供代码示例和网络链接,以便我可以详细阅读,因为我是这个主题的新手。
  • 请提供来自 CCDT 的 CLNTCONN 通道的显示,如下所示:DIS CHL(channel_name) HBINT
  • 我现在不能提供,直到下周一。这些信息会影响解决方案吗?
  • 没有它你能提供答案吗?

标签: c# .net ibm-mq


【解决方案1】:

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

注意: SVRCONN HBINT 的默认值为 300

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

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

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

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

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

  2. 特定于托管 .NET,客户端 HBINT 不能低于 SVRCONN HBINT 连接将失败并返回 2059。此问题影响有无 CCDT。

    • 使用 CCDT,您无法将 CLNTCONN HBINT 设置为小于 SVRCONN HBINT 的值
    • 如果没有 CCDT,如果 SVRCONN HBINT 设置为 301 或更高,您将受到影响
  3. 特定于托管 .NET,客户端接收超时以毫秒而不是秒计算。在这种情况下,根据 IBM 的说法,该缺陷已存在很长时间,但直到 APAR IT16167: Managed .NET client application does not send heartbeat request to queue manager 在 8.0.0.10 和 9.0.0.4 中引入(IBM 也确认这在 GA 9.1.0.0 中存在)才出现。以前不是问题的原因是托管 .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. 使用托管 .NET,您需要 MQ 管理员将 SVRCONN HBINT 设置为所需的值,然后您需要将 CCDT CLNTCONN HBINT 设置为与 @987654368 相同的值@HBINT.

如果您使用的是包含上述 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 @将 987654383@ 设置为较低的值以缩短 TIMEOUT。


在CCDTCLNTCONN频道上设置HBINT的例子:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多