100分钟后,websphere mq客户端主题无提示访问错误

时间:2015-11-25 15:05:38

标签: c# client ibm-mq

我们正在使用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分钟后停止接收来自主题的消息,即使没有错误消息,并且在此主题之后发布新消息分钟? 附带问题:为什么软重新连接不起作用,并且能够访问我们需要完全关闭程序的消息?

1 个答案:

答案 0 :(得分:0)

MQ中几乎没有可能导致此行为的情况。例如,浏览光标可能看不到到达的更新,更高优先级的消息。尽管队列深度非零,但不完整的消息组也可以返回2033。但是,您的描述不支持这两种情况中的任何一种情况。

然而,这部分似乎表明了MQ类中的一个错误:

  

通过网络数据包嗅探器调试后几乎完全透露出来   连接和访问主题后100分钟,我们的客户端停止   发送句点“获取”消息。然而,它发送听力   从这一点起每5分钟发一次消息 - 这似乎是客户端   (图书馆)自动功能。但是,客户端日志记录显示   我实际上仍在发送新消息和每个消息的请求   时间我不断得到代码2033作为回应,即使消息是   实际上在那里。

除非他们首先向QMgr询问消息,否则这些类无法可靠地返回2033。如果您的数据包捕获已完成(即感兴趣的网络流未遍历未捕获的线程或套接字),则类报告的行为与实际执行的行为不匹配。如果您可以在跟踪下可靠地重现它,那么IBM应该能够在PMR中解决它。

在此之前,您可能会被迫实施解决方法,例如定期重新启动应用。您还可以尝试创建对预定义队列的托管订阅,并更改应用程序以轮询该队列。如果问题与Topic对象隔离,则可以在不干扰该主题的任何其他订阅者的情况下解决问题。