在关闭和断开 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
和客户端应用程序之间协商的最高值。
注:SVRCONN
HBINT
的默认值为300
。
TIMEOUT 通过以下两种方式之一确定:
- 如果协商的
HBINT
小于 60,则超时为 2x HBINT
。
- 如果协商的
HBINT
大于或等于 60,则超时为 HBINT
+ 60。
特定于与 HBINT
相关的 .NET 客户端领域:
APAR IT26614 更正了以下三个问题:
在非托管或托管模式下,如果您不使用 CCDT,则 HBINT
将使用 SVRCONN
通道的值。实际上,如果不使用 CCDT,客户端的 HBINT
默认为 300
,因此这是您将看到的最低 HBINT
。
特定于 Managed .NET 客户端 HBINT
不能低于 SVRCONN
HBINT
连接将失败并显示 2059。此问题影响两者有或没有 CCDT。
- 使用 CCDT,您无法将
CLNTCONN
HBINT
设置为小于 SVRCONN
HBINT
的值
- 没有 CCDT 如果
SVRCONN
HBINT
设置为 301
或更高,您将受到影响
特定于托管 .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,可从以下位置下载:
- 9.0.0.7 MQC9: IBM MQ V9 Clients
- 9.1.3 MQC91: IBM MQC91: IBM MQ Clients
除非您使用的是包含上述 APAR 的 amqmdnet.dll
版本,或者您要求 IBM 为您提供任何较低版本的 IFIX,否则实现低于 300 HBINT 的唯一方法是需要SVRCONN
HBINT
与使用 CCDT 的客户端一起设置为较低的值,CLNTCONN
HBINT
设置为较低的值。基于非托管或托管 .NET,您有两个选择:
- 使用非托管 .NET,您可以将
CLNTCONN
HBINT
设置为 1
并允许客户端始终协商到 SVRCONN
HBINT
价值。然后您需要 MQ 管理员将 SVRCONN
HBINT
设置为所需的值。
- 使用 Managed .NET,您需要 MQ 管理员将
SVRCONN
HBINT
设置为所需的值,然后您需要设置 CCDT CLNTCONN
HBINT
与 SVRCONN
HBINT
. 相同的值
如果您正在使用包含上述 APAR 的 amqmdnet.dll
版本,或者您要求 IBM 为您提供任何较低版本的 IFIX,则工作原理如下:
- 如果不使用 CCDT,客户端将使用
HBINT(1)
的等价物,并将协商达到 SVRCONN
值。
- 如果使用 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)
是否可以为以下代码设置超时时间:
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
和客户端应用程序之间协商的最高值。
注:SVRCONN
HBINT
的默认值为300
。
TIMEOUT 通过以下两种方式之一确定:
- 如果协商的
HBINT
小于 60,则超时为 2xHBINT
。 - 如果协商的
HBINT
大于或等于 60,则超时为HBINT
+ 60。
特定于与 HBINT
相关的 .NET 客户端领域:
APAR IT26614 更正了以下三个问题:
在非托管或托管模式下,如果您不使用 CCDT,则
HBINT
将使用SVRCONN
通道的值。实际上,如果不使用 CCDT,客户端的HBINT
默认为300
,因此这是您将看到的最低HBINT
。特定于 Managed .NET 客户端
HBINT
不能低于SVRCONN
HBINT
连接将失败并显示 2059。此问题影响两者有或没有 CCDT。- 使用 CCDT,您无法将
CLNTCONN
HBINT
设置为小于SVRCONN
HBINT
的值
- 没有 CCDT 如果
SVRCONN
HBINT
设置为301
或更高,您将受到影响
- 使用 CCDT,您无法将
特定于托管 .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,可从以下位置下载:
- 9.0.0.7 MQC9: IBM MQ V9 Clients
- 9.1.3 MQC91: IBM MQC91: IBM MQ Clients
除非您使用的是包含上述 APAR 的 amqmdnet.dll
版本,或者您要求 IBM 为您提供任何较低版本的 IFIX,否则实现低于 300 HBINT 的唯一方法是需要SVRCONN
HBINT
与使用 CCDT 的客户端一起设置为较低的值,CLNTCONN
HBINT
设置为较低的值。基于非托管或托管 .NET,您有两个选择:
- 使用非托管 .NET,您可以将
CLNTCONN
HBINT
设置为1
并允许客户端始终协商到SVRCONN
HBINT
价值。然后您需要 MQ 管理员将SVRCONN
HBINT
设置为所需的值。 - 使用 Managed .NET,您需要 MQ 管理员将
SVRCONN
HBINT
设置为所需的值,然后您需要设置 CCDTCLNTCONN
HBINT
与SVRCONN
HBINT
. 相同的值
如果您正在使用包含上述 APAR 的 amqmdnet.dll
版本,或者您要求 IBM 为您提供任何较低版本的 IFIX,则工作原理如下:
- 如果不使用 CCDT,客户端将使用
HBINT(1)
的等价物,并将协商达到SVRCONN
值。 - 如果使用 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)