WebSphere7 MQTopic多个消息检索

时间:2011-03-11 09:41:55

标签: .net ibm-mq

我设法从给定主题中检索一条消息,但是当我尝试检索另一条消息时,它就会失败,即使主题上有消息。代码与IBM提供的示例代码相同,只是destForGet.Get(messageForGet);处于while循环中,并且在选项中有一些等待时间。另一个客户端将消息放入主题,这是有效的。收到第一条消息,但所有其他消息都没有收到。下面给出示例代码段:

// bool RunThread is managed from some other thread; irrelevant for this snippet
// MQTopic destForGet is initialized earlier; irrelevant for this snippet
MQMessage messageForGet = new MQMessage();
MQGetMessageOptions mgo = new MQGetMessageOptions();
mgo.Options = MQC.MQGMO_WAIT | MQC.MQGMO_FAIL_IF_QUIESCING | MQC.MQGMO_SYNCPOINT;
mgo.WaitInterval = 500;
string subName = "SampleSubscription";

while (RunThread)
{
    try
    {
        DestForGet.Get(messageForGet, mgo);
    }
    catch (MQException mqE)
    {
        Console.WriteLine("MQException caught. " + mqE.ToString());
    }
}

如果我在while循环中实例化messageForGet,那么它可以工作,但这似乎非常无效(不断分配/释放内存)。此外,messageForGet.ClearMessage()对此事没有帮助。有没有办法从主题中检索多条消息,而无需实例化每条消息?

2 个答案:

答案 0 :(得分:1)

你是什么意思“即使有关于这个主题的消息”?主题没有深度。最接近于MQ的主题消息是保留发布的概念。这是保留最后发布的消息的位置,以便新订户可以检索它。如果您发布10条消息然后订阅,则行为与您描述的内容相符 - 将收到一条消息。

答案 1 :(得分:0)

可能发生的是第一条消息设置消息描述符字段,其中包括消息ID。上使用相同的消息对象随后的GET时,的MsgID的存在导致WMQ到用它作为一个选择标准。

manual page on the MQQueue.Get method表示:

  

此方法采用MQMessage对象   作为参数。它使用了一些   对象中的字段作为输入   参数,特别是   messageId和correlationId,所以它是   确保这些设置很重要   根据需要。

MQMessage.ClearMessage()没有产生预期效果的原因是它对消息有效负载而不是描述符进行操作。根据{{​​3}},方法:

  

丢弃邮件中的所有数据   缓冲并设置数据偏移量   为零。

我建议实例化两条消息。保留一个零长度有效负载和空白消息描述符。然后在每次GET之前将空白消息复制到工作消息对象中。要么或清除该QMGR可以作为选择器如MSG ID,相关ID等使用的任何属性。