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

C# 在关闭和断开IBM MQ.NET客户端时设置超时,c#,.net,ibm-mq,C#,.net,Ibm Mq,是否可以为以下代码设置超时时间: private MQQueueManager queueManager; private MQQueue queue; ... queue.Close(); queueManager.Disconnect(); 原因是有时连接在试图关闭时会被卡住。关闭()或断开()时线程被阻塞 更新 客户端使用托管客户端、CCDT文件、群集队列管理器和其他可能导致不同设置的功能 请提供代码示例 我们是否可以通过如下API使用类似的方法更改超时设置: int o

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

private MQQueueManager queueManager;
private MQQueue queue;

   ...
queue.Close();
queueManager.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

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

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

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

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

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

  • 特定于托管.NET客户端
    HBINT
    不能低于
    SVRCONN
    HBINT
    连接将因2059而失败。该问题影响有无CCDT

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

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

    • 9.0.0.7
    • 9.1.3

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

  • 使用非托管.NET,您可以将
    CLNTCONN
    HBINT
    设置为
    1
    ,并允许客户端始终协商到
    SVRCONN
    HBINT
    值。然后需要MQ管理员将
    SVRCONN
    HBINT
    设置为所需的值
  • 使用托管.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)
    

    一旦你将另一个超时问题的内容合并到这个问题中,我将提供一个包含上述详细信息的答案,并在适用的情况下参考KC页面。@JoshMc感谢您提供的信息。一旦问题解决,我将关闭另一个。请提供代码示例和web链接,以便我可以详细阅读,因为我对本主题不熟悉。请提供CCDT的CLNTCONN频道显示,如下所示:
    DIS CHL(频道名称)HBINT
    。我现在无法提供,直到下周一。这些信息是否会影响解决方案?如果没有这些信息,您能否提供答案?
    DEFINE CHL(CLIENT_CHL) CHLTYPE(CLNTCONN) CONNAME('1.2.3.4(9999)') QMNAME(ABC) HBINT(1)