我设法从给定的主题中检索了一条消息,但是当我尝试检索另一条消息时,即使有关于该主题的消息,也会失败。代码与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()在这件事上也没有帮助。有没有一种方法可以从主题中检索多条消息,而不需要实例化每条消息?
发布于 2011-04-30 12:02:12
你所说的“即使有关于这个主题的消息”是什么意思?主题没有深度。与主题消息最接近的MQ是保留发布的概念。这是保留最后发布的消息的位置,以便新订阅者可以检索它。如果您发布了10条消息,然后订阅,则行为与您所描述的相匹配--将收到一条消息。
发布于 2011-03-12 07:50:18
可能发生的情况是,第一个消息设置消息描述符字段,其中包括消息ID。在使用相同消息对象的后续GET上,MsgID的存在会导致WMQ将其用作选择标准。
manual page on the MQQueue.Get method声明:
此方法接受MQMessage对象作为参数。它使用对象中的一些字段作为输入参数,特别是messageId和correlationId,因此确保根据需要设置这些字段非常重要。
MQMessage.ClearMessage()没有达到预期效果的原因是,它对消息有效负载进行操作,而不是对描述符进行操作。根据the manual page for MQMessage.ClearMessage()的说法,该方法:
丢弃消息缓冲区中的所有数据,并将数据偏移量设置回零。
我建议实例化两条消息。保留一个长度为零的有效负载和空白的消息描述符。然后,在每次获取之前,将空白消息复制到工作消息对象中。或者清除QMgr可以用作选择器的任何属性,如消息ID、相关ID等。
https://stackoverflow.com/questions/5271259
复制相似问题