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

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

注意:SVRCONN HBINT的默认值为300

超时是通过以下两种方法之一确定的:


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




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

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


在非托管或托管模式下,都有文件记录,如果您不使用CCDT,则HBINT将使用SVRCONN通道的值。实际上,如果不使用CCDT,则客户端的HBINT默认为300,因此这是您将看到的最低的HBINT
特定于受管.NET的客户端HBINT不能低于SVRCONN HBINT,连接将在2059年失败。无论是否使用CCDT,此问题都会影响。


使用CCDT时,无法将CLNTCONN HBINT设置为小于SVRCONN HBINT的值
没有CCDT的情况,如果SVRCONN HBINT设置为301或更高,将会受到影响


特定于Managed .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从未启动过心跳,队列管理器总是在HB​​INT + 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 CLNTCONN HBINT设置为较低值的CCDT与客户端一起将其设置为较低的值。基于非托管或托管.NET,您有两个选择:


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




如果您正在使用包含上述APAR的HBINT版本,或者您要求IBM为任何较低版本提供IFIX,则以下内容将起作用:


如果不使用CCDT,则客户端将使用等价的amqmdnet.dll,并将协商最多HBINT(1)的值。
如果使用CCDT,则SVRCONN可以将CLNTCONN设置为HBINT,这将导致不使用CCDT时具有与上述相同的行为,1将协商最多HBINT值。


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



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

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

关于c# - 在关闭和断开IBM MQ.NET客户端上设置超时,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50644990/

10-09 07:11