MQ客户机要花很多时间才能理解MQ队列管理器已关闭

本文关键字:MQ 队列 管理器 能理解 时间 客户机 | 更新日期: 2023-09-27 18:17:34

try
    {
        MQManager = new MQQueueManager(QueueManager);
        try
        {
            MQRequestQueue = MQManager.AccessQueue(QueueName, MQC.MQOO_INPUT_AS_Q_DEF + MQC.MQOO_FAIL_IF_QUIESCING);
            return true;
        }
        catch (IBM.WMQ.MQException exIBM)
        {
            CloseConnection();
            ErrorCode = exIBM.Reason;
            ErrorDescription = exIBM.Message;
                            }
    }
    catch (IBM.WMQ.MQException exIBM)
    {
        CloseConnection();
        ErrorCode = exIBM.Reason;
        ErrorDescription = exIBM.Message;

我使用上面的c#代码使用WebsphereMQ提供的MQseries dll连接到MQ。当QueueManager关闭时,它需要20-30秒,直到我得到异常,我可以看到这段代码中所有的东西都停止了。

是MQ客户机-服务器通信的预期行为吗?如果没有,我如何检测队列管理器是否关闭,以便我可以点击下一个可用的队列管理器?是否有超时属性?

MQ客户机要花很多时间才能理解MQ队列管理器已关闭

当您运行客户机-服务器通信时,就像您所说的那样,其中涉及到网络。当队列管理器不可用时,应用程序的检测时间将取决于应用程序当时正在做什么以及队列管理器是如何结束的。

如果队列管理器处于静默状态,并且应用程序当时正在使用队列管理器连接,那么您应该立即收到通知。类似地,如果您有一个连接异常处理程序,那么即使您的应用程序当时没有使用队列管理器连接,异常处理程序也会像使用队列管理器连接一样计数,并且您应该立即收到通知。您提供的代码片段表明,当队列管理器被删除时,您可能在暗示您处于等待状态。

如果队列管理器的关闭比静默更严重,那么您可能不得不依赖网络超时来检测队列管理器不再位于套接字的另一端,这就是您的延迟。

你能在你的问题中指出队列管理器是如何结束的,以及你是否有一个异常处理程序,或者你的应用程序在队列管理器关闭时是否实际上正在使用连接吗?

您还可以使用IBM MQ版本和SVRCONN通道的详细信息(特别是SHARECNV和HBINT)更新您的问题吗?

由于您没有给出完整的代码,因此从您的代码中不清楚您正在使用的是哪种类型的连接,绑定或客户端。您的应用程序连接到运行在同一台机器上的队列管理器(作为您的应用程序)还是连接到不同的机器上。您是否在代码中初始化了MQEnvironment类?

如果它是绑定连接,即你的应用程序使用共享内存连接到运行在同一台机器上的队列管理器,那么应该立即抛出异常。

如果您的应用程序连接到运行在另一台机器上的队列管理器,那么就会出现网络延迟。也有可能主机名解析需要花费时间。所以你需要检查你的网络。

我想我们需要更多关于你的申请的信息。基于此,我可能会进一步提供帮助。

由于TCP连接超时,MQ客户端正在花费时间来理解MQ队列已关闭。MQ客户端,如果安装在Windows服务器上,请根据Windows操作系统的TCP超时设置等待一段固定的时间

如果要处理MQclient的TCP超时,可以通过位于已安装MQ位置的MQclient .ini执行,即C:/../IBM/Webshperemq

http://www.ibm.com/support/knowledgecenter/SSFKSJ_7.5.0/com.ibm.mq.con.doc/q016840_.htm