我们正在使用WebSphereMQ中的主题集成通信。 对于MQ使用c#库,版本8,dll是来自官方IBM网站下载的mqc8_8.0.0.3_win64.zip。 我们连接到服务器没有问题,然后我们访问指定的主题,我们将连接设置为持久,提供userID。然后我们进入一个无限循环,询问每2分钟是否有本主题中发布的新消息。这非常有效。如果客户发布消息 - 我们得到它们。如果我们在不删除订阅的情况下断开连接,我们可以在重新连接后重新启动它并在那里发送消息。连接方式似乎没问题。
问题在于,经过一些半谜时间(只是要求新消息,但每次都要回复代码2033 - 没有新消息),某些东西就会停止工作。但是没有其他(例如网络)错误代码。我们不断获得代码2033,但即使将它们放在那里,我们也无法再收到消息。 如果我们断开连接(完全关闭客户端应用程序)并重新连接,那么消息就会存在,并且可以在另一段时间内正常工作。
通过网络数据包嗅探器调试显示,在连接和访问主题后差不多100分钟后,我们的客户端停止发送时间段"得到"消息。然而,它确实每隔5分钟发送一次听力消息 - 这似乎是客户端(库)的自动功能。 然而,客户端日志记录显示我实际上仍然发送对新消息的请求,并且每次我将代码2033作为响应,即使消息实际存在。 由于这种情况每100分钟及时发生一次,我们认为这是一种暂停,但我们无法确定何时超时。 经过一番搜索,我在IBM的文档中找到了这个:http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_7.5.0/com.ibm.mq.ref.con.doc/q081860_.htm 关于断开间隔设置为100分钟,但在与其他公司的MQ服务器管理员联系后,我得到保证,实际上他们将此值设置为0,因此不应该是这种情况。此外,根据网络嗅探,看起来客户端正在停止Get消息而不是服务器断开我们。
还有一个更大的难题。我们尝试对queuemanager进行软断开连接并重新连接并重新访问主题,但它没有帮助,就好像即使有新的queuemanager实例也保留了一些静态字段。我们需要完全关闭客户端程序才能接收消息。而且这一次,除了代码2033(没有新消息)之外,我们不会收到任何其他错误消息。
现在有些代码。 每次都用于连接/重新连接:
public void Connect()
{
MQEnvironment.Hostname = connectionName;//please assume those are correctly filled values
MQEnvironment.Port = port;
MQEnvironment.Channel = channelName;
queueManager = new MQQueueManager(QueueManagerName);
}
接下来我们访问该主题。
public MQTopic AccessTopic(string topicName)
{
MQTopic topic = null;
topic = queueManager.AccessTopic(topicName, null, MQC.MQSO_CREATE | MQC.MQSO_FAIL_IF_QUIESCING | MQC.MQSO_MANAGED | MQC.MQSO_DURABLE | MQC.MQSO_RESUME, null, "subNameXYZ");
return topic;
}
接下来,我们阅读主题。所有功能都与Try / Catch状态一起使用,但我已经对它们进行了一些清理,以便于查看。这是一个循环,每2分钟一次。
public string ReadTopic(MQTopic topic)
{
string strReturn = "";
if (topic != null)
{
try
{
queueMessage = new MQMessage();
queueMessage.Format = MQC.MQFMT_STRING;
queueGetMessageOptions = new MQGetMessageOptions();
topic.Get(queueMessage, queueGetMessageOptions);
strReturn = queueMessage.ReadString(queueMessage.MessageLength);
queueMessage.ClearMessage();
}
catch (MQException exp)
{
//checking if code = 2033 "no new message"
}
}
return strReturn;
}
此外,每个循环,在访问readtopic之前,我们检查连接是否正常,如果没有,重新连接,如下所示:
public void CheckConnection()
{
if (!queueManager.IsConnected)
{
queueManager.Disconnect();
queueManager.Close();
Connect();
}
}
因此,简而言之:问题是什么可能导致我们的连接在每次差不多100分钟后停止接收来自主题的消息,即使没有错误消息,并且在此主题之后发布新消息分钟? 附带问题:为什么软重新连接不起作用,并且能够访问我们需要完全关闭程序的消息?
答案 0 :(得分:0)
MQ中几乎没有可能导致此行为的情况。例如,浏览光标可能看不到到达的更新,更高优先级的消息。尽管队列深度非零,但不完整的消息组也可以返回2033。但是,您的描述不支持这两种情况中的任何一种情况。
然而,这部分似乎表明了MQ类中的一个错误:
通过网络数据包嗅探器调试后几乎完全透露出来 连接和访问主题后100分钟,我们的客户端停止 发送句点“获取”消息。然而,它发送听力 从这一点起每5分钟发一次消息 - 这似乎是客户端 (图书馆)自动功能。但是,客户端日志记录显示 我实际上仍在发送新消息和每个消息的请求 时间我不断得到代码2033作为回应,即使消息是 实际上在那里。
除非他们首先向QMgr询问消息,否则这些类无法可靠地返回2033。如果您的数据包捕获已完成(即感兴趣的网络流未遍历未捕获的线程或套接字),则类报告的行为与实际执行的行为不匹配。如果您可以在跟踪下可靠地重现它,那么IBM应该能够在PMR中解决它。
在此之前,您可能会被迫实施解决方法,例如定期重新启动应用。您还可以尝试创建对预定义队列的托管订阅,并更改应用程序以轮询该队列。如果问题与Topic对象隔离,则可以在不干扰该主题的任何其他订阅者的情况下解决问题。