ErrorManager.ReturnMessageToSourceQueue C# (CSharp) Method

ReturnMessageToSourceQueue() public method

May throw a timeout exception if a message with the given id cannot be found.
public ReturnMessageToSourceQueue ( string messageId ) : void
messageId string
return void
    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);
                }
            }
        }
    }

Usage Example

Example #1
0
        static void Main(string[] args)
        {
            var errorManager = new ErrorManager();

            string inputQueue = null;
            string messageId  = null;

            if (args != null && args.Length > 0)
            {
                inputQueue = args[0];
            }

            if (args != null && args.Length > 1)
            {
                messageId = args[1];
            }

            if (inputQueue == null)
            {
                Console.WriteLine("Please enter the error queue you would like to use:");
                inputQueue = Console.ReadLine();
            }

            if (messageId == null)
            {
                Console.WriteLine("Please enter the id of the message you'd like to return to its source queue, or 'all' to do so for all messages in the queue.");
                messageId = Console.ReadLine();

                Console.WriteLine("Attempting to return message to source queue. Please stand by.");
            }

            errorManager.InputQueue = Address.Parse(inputQueue);

            try
            {
                if (messageId == "all")
                {
                    errorManager.ReturnAll();
                }
                else
                {
                    errorManager.ReturnMessageToSourceQueue(messageId);
                }

                if (args == null || args.Length == 0)
                {
                    Console.WriteLine("Press 'Enter' to exit.");
                    Console.ReadLine();
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("Could not return message to source queue. Reason: " + e.Message);
                Console.WriteLine(e.StackTrace);

                Console.WriteLine("\nPress 'Enter' to exit.");
                Console.ReadLine();
            }
        }
All Usage Examples Of ErrorManager::ReturnMessageToSourceQueue