как я могу получить все доступные сообщения в очереди MSMQ - PullRequest
3 голосов
/ 04 августа 2009

Как лучше всего обработать все сообщения, находящиеся в очереди в данный момент?

У нас есть очередь с большим количеством очень маленьких сообщений, и я хотел бы прочитать все текущие сообщения и затем отправить их через пул потоков для обработки.

Я не могу найти ни одного хорошего ресурса, который покажет мне, как я могу создать простой метод для возврата IEnnumerable, например

Спасибо

Ответы [ 4 ]

9 голосов
/ 04 августа 2009

Хотя я согласен с Ника , что цель очереди больше для обработки стиля FIFO, и Решение ArsenMkrt будет работать, другой вариант предполагает использование MessageEnumerator и сваливание сообщений в ваш IEnumerable.

var msgEnumerator = queue.GetMessageEnumerator2();
var messages = new List<System.Messaging.Message>();
while (msgEnumerator.MoveNext(new TimeSpan(0, 0, 1)))
{
    var msg = queue.ReceiveById(msgEnumerator.Current.Id, new TimeSpan(0, 0, 1));
    messages.Add(msg);
}
2 голосов
/ 07 февраля 2014

Для простых вещей ...

public void DoIt()
    {

        bool continueToSeekForMessages = true;

        while (continueToSeekForMessages)
        {
            try
            {
                var messageQueue = new System.Messaging.MessageQueue(@"FormatName:Direct=OS:MyComputerNameHere\Private$\MyPrivateQueueNameHere");
                var message = messageQueue.Receive(new TimeSpan(0, 0, 3));
                message.Formatter = new System.Messaging.XmlMessageFormatter(new String[] { "System.String,mscorlib" });
                var messageBody = message.Body;

            }
            catch (Exception ex)
            {
                continueToSeekForMessages = false;
            }
        }
    }

.

Также можно использовать peek вместо удаления сообщения из очереди.

Также можно использовать GetMessageEnumerator2

0 голосов
/ 02 июня 2014

Последние версии MSMQ также имеют следующую функцию:

Вы можете получить все сообщения в одном объекте, например: (Напишите свой собственный обработчик «ReceiveCompleted event»)

private static void MyReceiveCompleted(Object source,
        ReceiveCompletedEventArgs asyncResult)
    {
        MessageQueue mq = (MessageQueue)source;
        try
        {
            Message[] mm = mq.GetAllMessages();
            foreach (Message m in mm)
            {
            // do whatever you want
            }
        }
        catch (MessageQueueException me)
        {
            Console.WriteLine(me.Message);
        }
        finally
        {

        }


        return;
    }
0 голосов
/ 04 августа 2009

Разве это не побеждает цель очереди? Предполагается, что очередь хранит порядок сообщений, поэтому вам нужно пройтись по ней и продолжать извлекать первое сообщение.

...