WebSphere7 MQTopic получение нескольких сообщений - PullRequest
1 голос
/ 11 марта 2011

Мне удается получить одно сообщение из данной темы, но когда я пытаюсь получить другое сообщение, оно просто перестает работать, даже если в теме есть сообщения. Код аналогичен предоставленному 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());
    }
}

Если я создаю экземпляр messageForGet в цикле while, то он работает, но это кажется очень неэффективным (постоянно выделять / освобождать память). Также messageForGet.ClearMessage() не помогает в этом вопросе. Есть ли способ получить несколько сообщений из темы, не создавая экземпляры каждого отдельного сообщения?

Ответы [ 2 ]

1 голос
/ 30 апреля 2011

Что вы подразумеваете под "хотя есть сообщения на эту тему"? Темы не имеют глубины. Самым близким MQ к сообщениям на эту тему является концепция сохраняемой публикации. Здесь хранится последнее опубликованное сообщение, чтобы его мог получить новый подписчик. Если вы публикуете 10 сообщений и затем подписываетесь, поведение соответствует тому, что вы описываете, - будет получено одно сообщение.

0 голосов
/ 12 марта 2011

Что, вероятно, происходит, так это то, что первое сообщение устанавливает поля дескриптора сообщения, среди которых идентификатор сообщения.При последующем GET, использующем тот же объект сообщения, наличие MsgID заставляет WMQ использовать его в качестве критерия выбора.

Страница руководства в методе MQQueue.Get гласит:

Этот метод принимает объект MQMessage в качестве параметра.Он использует некоторые поля объекта в качестве входных параметров, в частности messageId и correlationId, поэтому важно убедиться, что они установлены в соответствии с требованиями.

Причина, по которой MQMessage.ClearMessage() делаетНе имеет желаемого эффекта то, что это действует на полезную нагрузку сообщения, а не на дескриптор.Согласно странице руководства для MQMessage.ClearMessage(), метод:

Удаляет любые данные в буфере сообщений и устанавливает смещение данных обратно в ноль.

Я бы предложил создать два сообщения.Оставьте один с полезной нагрузкой нулевой длины и пустым дескриптором сообщения.Затем перед каждым GET скопируйте пустое сообщение в рабочий объект сообщения.Или это, или очистите любые свойства, которые QMgr может использовать в качестве селекторов, такие как Msg ID, Correlation ID и т. Д.

...