【问题标题】:Message queue looping消息队列循环
【发布时间】:2011-07-17 15:26:20
【问题描述】:

我在 c# 中有一个控制台应用程序,我正在尝试从消息队列接收消息,直到消息队列为空。比如,

MessageQueue queue = new MessageQueue();
While(queue.notempty)
{
    queue.receive(...)
}

我该怎么做?

谢谢。

【问题讨论】:

  • 你是指MSMQ还是其他类型的消息队列?

标签: c# msmq


【解决方案1】:

如果您在 C# 中执行此操作,Queue<T> 类应该可以工作:

Queue<Message> queue = GetMessageQueue();

while(queue.Count > 0)
{
     Message message = queue.Dequeue();
     // process message
}

如果您计划从多个线程填充队列,您可以考虑改用ConcurrentQueue&lt;T&gt;(或BlockingCollection&lt;T&gt;)。


如果您正在为 MSMQ 使用 MessageQueue 类,您可以随时使用:

MessageQueue queue = ...

TimeSpan timeout = TimeSpan.FromMilliseconds(100); // Small timeout - can be very small

Message message = queue.Receive(timeout);
while (message != null)
{
      // Process message...


      message = queue.Receive(timeout);
}

【讨论】:

  • 他是关于不同的主题:MSMQ
  • @Andrey:以防万一(不清楚),我也更新了它:)
  • 仅供参考,如果您传递超时参数,则接收方法将在超时到期时抛出异常。您必须在循环中尝试/捕获并自己返回 null。
【解决方案2】:

没有办法检查队列是否为空。您必须以这种方式接收它:

private Message Receive(MessageQueue queue)
{
   try 
   {
      return queue.Receive(TimeSpan.Zero);
   }
   catch (MessageQueueException mqe)
   {
      if (mqe.MessageQueueErrorCode == MessageQueueErrorCode.IOTimeout)
         return null;
      throw;
   }
}

那你就可以了

MessageQueue queue = new MessageQueue();
Message msg;
while( (msg = Receive(queue)) != null)
{
    //process
}

【讨论】:

    【解决方案3】:
     public class PersonDetails
     {
       public string FirstName { get; set; }
       public string LastName { get; set; }
       public DateTime DateTime { get; set; }
     }
    
         const string queueName = @".\private$\PersonQueue";
    
         public void GetMessageFromQueue(string queueName)
         {
          MessageQueue perosnMessageQueue = new MessageQueue(queueName);
         try
         {
         XmlMessageFormatter xmlMessageFormatter = new XmlMessageFormatter(new Type[] { 
                                   (typeof(PersonDetails)) });
          perosnMessageQueue.Formatter = xmlMessageFormatter;
          perosnMessageQueue.Refresh();
          for (int i = perosnMessageQueue.GetAllMessages().Count(); i !=0; i--)
          {
          var personDetailsFromQueue =
                             (PersonDetails)perosnMessageQueue.Receive
                             (MessageQueueTransactionType.Automatic).Body;
    
            Console.WriteLine("FistName : {0} \n LastName : {1} \n Date Time : 
             {2}",personDetailsFromQueue.FirstName, 
                  personDetailsFromQueue.LastName, 
                  personDetailsFromQueue.DateTime);`  
           }
    

    【讨论】:

      猜你喜欢
      • 2018-09-18
      • 1970-01-01
      • 2018-11-23
      • 2020-11-27
      • 2020-04-18
      • 2020-03-31
      • 2011-02-20
      • 2013-08-09
      • 2012-10-10
      相关资源
      最近更新 更多