2009-08-04 4 views
3

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

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

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

Благодаря

ответ

0

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

+0

Вы правы, к сожалению, я не был вовлечен в первоначальный дизайн системы, поэтому мы ищем варианты, чтобы заставить его работать немного лучше с услугами, которые у нас есть –

9

Хотя я согласен с Nick, что целью Queue является более для обработки типа FIFO, и ArsenMkrt's решения будет работать, еще один вариант предполагает использование 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

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

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

Последних версий MSMQ также имеет следующую особенность:

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

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; 
    } 
Смежные вопросы