2009-08-04 74 views
3

可用消息最新最好的方式來獲得當前在隊列來處理所有的消息?我怎麼可以得到所有在MSMQ隊列

我們有大量的非常小的消息,我想這樣做的隊列中讀取當前的所有信息關掉,然後通過處理一個線程池發送。

我似乎無法找到任何很好的資源,它會顯示我怎麼可以創建一個簡單的方法返回一個IEnnumerable例如

感謝

回答

0

不在於打敗隊列的目的?隊列應該保持消息的順序,所以你必須循環並繼續關閉第一條消息。

+0

你說得對,不幸的是,我並沒有參與系統的初始設計,所以我們正在尋找選擇,使它更好地使用我們提供的服務 – 2009-08-04 18:43:43

9

雖然我Nick同意隊列的目的是多爲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; 
    }