首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WebSphere7 MQTopic多邮件检索

WebSphere7 MQTopic多邮件检索
EN

Stack Overflow用户
提问于 2011-03-11 17:41:55
回答 2查看 197关注 0票数 1

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

代码语言:javascript
复制
// 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()在这件事上也没有帮助。有没有一种方法可以从主题中检索多条消息,而不需要实例化每条消息?

EN

回答 2

Stack Overflow用户

发布于 2011-04-30 12:02:12

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

票数 1
EN

Stack Overflow用户

发布于 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等。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5271259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档