WMQ客户端停止mq get而不抛出任何异常

时间:2015-11-12 17:32:45

标签: .net ibm-mq mq

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

  

进程(1612.3)用户(SYSTEM)程序(MMQ.Receiver.exe)主机(*****)安装(安装1)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队列

1 个答案:

答案 0 :(得分:0)

尝试将登录添加到连接已损坏的异常处理案例中。我认为您的客户端应用程序只是抛出类型为MQRC_CONNECTION_BROKEN的MQException - 在这种情况下,您的代码会以静默方式断开连接并重新连接。 (注意10054通常意味着另一端已决定关闭连接,如果出现网络问题,这将在此处占用)