【问题标题】:WMQ Client stops mq get without throwing any exceptionWMQ 客户端停止 mq get 而不抛出任何异常
【发布时间】:2015-11-12 17:32:45
【问题描述】:

我有一个侦听 MQ 队列管理器并获取消息的 Windows 服务。发生网络中断,MQ .Net 客户端停止侦听 MQ 队列。应用程序也不例外。所以当我看到事件日志时出现了错误

进程(1612.3) 用户(SYSTEM) 程序(MMQ.Receiver.exe) 主机(*****) 安装(Installation1) VRMF(7.5.0.4)

从主机接收错误。

从 TCP/IP 接收数据时出错。这可能是由于通信故障。

TCP/IP (socket.Receive) 调用的返回码是 10054 (X'2746')。记录这些值并告诉系统管理员。

MQ 客户端文件与下面一行有同样的错误。

IBM.WMQ.MQTCPConnection.Receive

我应该如何处理这些类型的错误。正如我所说,代码中没有抛出错误。下面是我的代码

try
            {
                if (queuereceive == null)
                {                        
                    RetryConnection();
                }
                else
                {
                    inboundmsg = new MQMessage();                        
                    queuereceive.Get(inboundmsg, queueGetMessageOptions);

                    //code where it receives the message and do the process 

                    inboundmsg.ClearMessage();
                }
            }
            catch (MQException mqe)
            {
                inboundmsg = null;
                if (mqe.Reason == MQC.MQRC_NO_MSG_AVAILABLE)
                {

                }
                else if (mqe.Reason == MQC.MQRC_CONNECTION_QUIESCING || mqe.Reason == MQC.MQRC_CONNECTION_BROKEN)
                {
                    if (queueManagerreceive != null)
                    if (queueManagerreceive.IsConnected)
                    {
                        queueManagerreceive.Disconnect();
                    }

                    RetryConnection(); //retire connection if an exception is thrown 
                }
                else
                {
                    Logger.Error(string.Format("MQQueue::Get ended with {0} ", mqe.Message));
                    if (queueManagerreceive != null)
                    if (queueManagerreceive.IsConnected)
                    {
                        queueManagerreceive.Disconnect();
                    }

                    // treat truncated message as a failure 
                    if (mqe.Reason == MQC.MQRC_TRUNCATED_MSG_FAILED)
                    {
                        Logger.Error(string.Format("MQQueue::Get ended with {0}  ", mqe.Message));
                    }

                    RetryConnection(); //retire connection if an exception is thrown 
                }
            }

注意:RetryConnection 重新连接到 MQ 队列

【问题讨论】:

    标签: .net ibm-mq mq


    【解决方案1】:

    尝试在连接中断异常处理案例中添加日志记录。我认为您的客户端应用程序只是被抛出一个 MQRC_CONNECTION_BROKEN 类型的 MQException - 在这种情况下,您的代码会默默地断开连接并重新连接。 (注 10054 通常表示另一端已决定关闭连接,如果出现网络问题,该连接将在此处绑定)

    【讨论】:

    • 在我的代码中它抛出异常并尝试重新连接直到它成功并且我也有日志记录,我刚刚在这段代码中删除了。但在这种情况下,服务没有抛出异常,我发现事件日志中的错误应该是什么情况?
    • 有没有办法增加 MQ 客户端的默认重连超时时间(即 30 分钟)?
    • 30 分钟重新连接超时是什么意思。连接断开后,您应该能够重试连接。如果问题是原始连接仍然出现在服务器上锁定新连接所需的资源,请考虑您是 sharecnv>0 并使用 HBINT(MQv7 客户端+),还是需要使用 keepalive(尽管默认为 2 小时)。
    • 当网络中断时,客户端等待 30 分钟重新连接,然后抛出异常 MQRC_RECONNECT_ENDED。我说的是 30 分钟超时
    猜你喜欢
    • 2016-07-01
    • 2012-03-19
    • 2019-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    相关资源
    最近更新 更多