2009-08-04 58 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; 
    }