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

时间:2009-08-04 16:55:54

标签: c# .net msmq

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

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

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

由于

4 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分: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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

您可以在单个对象中获取所有消息,如下所示:(编写您自己的&#34; ReceiveCompleted事件&#34;处理程序)

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;
    }