public void ReturnMessageToSourceQueue(string messageId)
{
using (var scope = new TransactionScope())
{
try
{
var message = queue.ReceiveById(messageId, TimeoutDuration, MessageQueueTransactionType.Automatic);
var headers = MsmqUtilities.ExtractHeaders(message);
string failedQ;
if (!headers.TryGetValue(Headers.FailedQ, out failedQ))
{
Console.WriteLine("ERROR: Message does not have a header indicating from which queue it came. Cannot be automatically returned to queue.");
return;
}
using (var q = new MessageQueue(MsmqUtilities.GetFullPath(MsmqAddress.Parse(failedQ))))
{
q.Send(message, MessageQueueTransactionType.Automatic);
}
Console.WriteLine("Success.");
scope.Complete();
}
catch (MessageQueueException ex)
{
if (ex.MessageQueueErrorCode == MessageQueueErrorCode.IOTimeout)
{
Console.WriteLine(NoMessageFoundErrorFormat, messageId);
uint messageCount = 0;
foreach (var m in queue.GetAllMessages())
{
messageCount++;
var headers = MsmqUtilities.ExtractHeaders(m);
var originalId = GetOriginalId(headers);
if (string.IsNullOrEmpty(originalId) || messageId != originalId)
{
if (messageCount%ProgressInterval == 0)
{
Console.Write(".");
}
continue;
}
Console.WriteLine();
Console.WriteLine("Found message - going to return to queue.");
using (var tx = new TransactionScope())
{
var failedQueue = headers[Headers.FailedQ];
using (var q = new MessageQueue(MsmqUtilities.GetFullPath(MsmqAddress.Parse(failedQueue))))
{
q.Send(m, MessageQueueTransactionType.Automatic);
}
queue.ReceiveByLookupId(MessageLookupAction.Current, m.LookupId, MessageQueueTransactionType.Automatic);
tx.Complete();
}
Console.WriteLine("Success.");
scope.Complete();
return;
}
Console.WriteLine();
Console.WriteLine(NoMessageFoundInHeadersErrorFormat, messageId);
}
}
}
}