Reputation: 3409
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
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
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
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