如何在MSMQ队列上获取所有可用消息

什么是获取当前队列中的所有消息进行处理的最佳方法?

我们有一个包含大量非常小的消息的队列,我想要做的是读取所有当前消息,然后通过线程池发送它们进行处理。

我似乎无法找到任何好的资源,它将告诉我如何创建一个简单的方法来返回IEnnumerable例如

谢谢

虽然我同意Nick的看法,队列的目的更多是用于FIFO样式处理,而ArsenMkrt的解决方案将起作用,另一个选择是使用MessageEnumerator并将消息堆积到IEnumerable中。

var msgEnumerator = queue.GetMessageEnumerator2(); var messages = new List(); while (msgEnumerator.MoveNext(new TimeSpan(0, 0, 1))) { var msg = queue.ReceiveById(msgEnumerator.Current.Id, new TimeSpan(0, 0, 1)); messages.Add(msg); } 

对于简单的东西……

 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

这不是打败了队列的目的吗? 队列应该保持消息的顺序,所以你必须循环并继续拉出第一个消息。

最新版本的MSMQ还具有以下function:

您可以在单个对象中获取所有消息,如下所示:(编写您自己的“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; }