Tony
Tony

Reputation: 3409

Message queue looping

I have a console app in c# and I am trying to receive a message from a message queue until the message queue is empty. So something like,

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

How can I do this?

Thanks.

Upvotes: 4

Views: 4743

Answers (3)

rafiq J
rafiq J

Reputation: 1

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

Upvotes: 0

Andrey
Andrey

Reputation: 60055

There is no way to check whether queue is empty or not. You have to receive it this way:

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

then you can do

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

Upvotes: 5

Reed Copsey
Reed Copsey

Reputation: 564333

If you're doing this in C#, the Queue<T> class should work:

Queue<Message> queue = GetMessageQueue();

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

If you plan to populate the queue from multiple threads, you could consider using ConcurrentQueue<T> (or BlockingCollection<T>) instead.


If you are using the MessageQueue class for MSMQ, you can always use:

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

Upvotes: 1

Related Questions