Message Queuing Cycle

I have a console application in C # and I'm trying to get a message from the 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.

+4
source share
3 answers

There is no way to check if the queue is empty or not. You should get 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 } 
+5
source

If you do 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 fill a queue of multiple threads, you can use ConcurrentQueue<T> (or BlockingCollection<T> ) instead.


If you use 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); } 
0
source
  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);' } 
0
source

Source: https://habr.com/ru/post/1344166/


All Articles