当.net Windows服务连接到Websphere MQ队列以进行订阅并继续阅读消息时,我们如何处理网络断开等问题或者发生了一些错误的事情,我们是否可以始终依赖MQQueueManager.IsConnected
属性?这篇文章令我困惑:IC75673: MQQueueManager.IsConnected property is "true" after the connection is broken in a .NET application.
下面是我必须从队列中读取消息的代码,我正在使用MQ Version 8.0
private MQQueueManager _queueManager;
private MQQueue _queue;
private MQTopic _topic;
public bool isSubscribed = false;
public void Subscribe()
{
var queueManagerName = "myQueueManager";
var properties = new Hashtable();
//Set all the properties here
_queueManager = new MQQueueManager(queueManagerName, properties);
//Conect to Queue
_queue = _queueManager.AccessQueue("devQueue", MQC.MQOO_INPUT_AS_Q_DEF);
isSubscribed = true;
while (isSubscribed)
{
if (cancellationToken.IsCancellationRequested)
{
isSubscribed = false;
cancellationToken.ThrowIfCancellationRequested();
}
try
{
Receive(onMessageReceived);
}
catch (Exception ex)
{
Console.WriteLine("Exception: {0}", ex);
}
}
}
public override void Receive<T>(Action<T> onMessageReceived)
{
try
{
var dataReceived = new MQMessage();
_queue.Get(dataReceived);
T message;
message = (T)(object)dataReceived;
onMessageReceived(message);
_queueManager.Commit();
}
catch (Exception ex)
{
throw ex;
}
}
答案 0 :(得分:0)
您链接到的APAR IC75673已在已发布Aug 01 2011的MQ版本7.0.1.6中修复。 MQ v8.0发布了June 13 2014。通常,MQ的先前版本中的任何固定版本也将在新版本中修复。
您的应用程序是否连接到运行应用程序的同一Windows服务器上的队列管理器?在您的代码中,您不指定主机名,端口,通道名称等指示您正在通过网络使用MQ客户端连接的内容。您可以使用MQSERVER或MQCHLLIB / MQCHLTAB环境变量提供连接详细信息。
如果您的应用程序与队列管理器建立本地连接,则它正在使用所谓的“绑定模式”,并且不依赖于网络。 IsConnected方法是您仍然连接的良好指示。该文档指出,如果您的连接处于空闲状态,则提供的状态是执行上一个活动时的最后已知状态(Get,Put等)。
如果您的应用程序通过网络建立MQ客户端连接,则客户端注意到连接断开所需的时间取决于队列管理器和MQ客户端之间协商的HBINT。对于.NET,您似乎需要使用MQ通道表来设置此值。 @Morag Hughson回答StackOverflow问题“WebSphere MQ - Changing channel definition structure using XMS.NET API”提供了更多细节。您还可以查看我对StackOverflow问题“Setting timeout for IBM MQ”的回答,详细了解HBINT如何影响客户端通道的TIMEOUT。