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