コード例 #1
0
        public static IFailedMessageHandler CreateFailureHandler(FailureHandlerType type, string queueName, string deadQueueName, string retryQueueName)
        {
            IFailedMessageHandler failureHandler = null;

            if (type == FailureHandlerType.Discard)
            {
                failureHandler = new DiscardMessageHandler();
            }
            if (type == FailureHandlerType.AlwaysRollback)
            {
                failureHandler = new AlwaysRollBackHandler();
            }
            else if (type == FailureHandlerType.SendToBack)
            {
                failureHandler = new SendToBackHandler(
                    CreateAndGetQueue(deadQueueName));
            }
            else if (type == FailureHandlerType.RetrySendToDead)
            {
                failureHandler = new RetrySendToDeadLetterQueueHandler(
                    CreateAndGetQueue(deadQueueName));
            }
            else if (type == FailureHandlerType.SeparateRetry)
            {
                failureHandler = new SeparateRetryQueueHandler(
                    CreateAndGetQueue(retryQueueName));
            }


            return(failureHandler);
        }
コード例 #2
0
        public void receiveMessage(IFailedMessageHandler failedMessageHandler)
        {
            if (incomingQueue == null)
            {
                throw new NullReferenceException("La coda di ricezione non è stata specificata");
            }
            gotMessage = null;


            SetFormatter();


            MessageQueueTransaction transaction = new MessageQueueTransaction();

            transaction.Begin();
            // Message message = null;
            try
            {
                gotMessage = incomingQueue.Receive(TimeSpan.Zero, transaction);

                Log("Received message ID: " + gotMessage.Id);
                ProcessMessage();
                transaction.Commit();
                Log("Message processed OK");
            }
            catch (Exception e)
            {
                Log("Message failed");
                TransactionAction transactionAction = TransactionAction.ROLLBACK;

                if (gotMessage == null)
                {
                    Log("Message couldn't be received: " + e.Message);
                    Log("Message couldn't be received (stak: " + e.StackTrace);
                }
                else
                {
                    try
                    {
                        transactionAction = failedMessageHandler.HandleFailedMessage(gotMessage, transaction);
                    }
                    catch (Exception failureHandlerException)
                    {
                        Log("Error during failure handling: " + failureHandlerException.Message);
                    }
                }

                if (transactionAction == TransactionAction.ROLLBACK)
                {
                    transaction.Abort();
                    Log("Transaction rolled back");
                }
                else
                {
                    transaction.Commit();
                    Log("Transaction commited - message removed from queue");
                }
            }
        }
コード例 #3
0
        /// <summary>
        /// Receive message wrapped with a transaction to handle failures based on handler passed into ctor
        /// </summary>
        /// <param name="failedMessageHandler">Determines what implementation should be taken in the event of poisoned messages.</param>
        private bool ReceiveMessage(msmq.MessageQueue incomingQueue, IFailedMessageHandler failedMessageHandler)
        {
            incomingQueue.MessageReadPropertyFilter.SetAll();
            using (var transaction = new MessageQueueTransaction())
            {
                transaction.Begin();
                Message message = null;
                try
                {
                    message = incomingQueue.Receive(TimeSpan.Zero, transaction);
                    Logger.LogDebug("Received message ID: " + message.Id);

                    ProcessMessage(message);

                    transaction.Commit();
                    Logger.LogDebug("Message processed OK");
                    return true;
                }
                catch (MessageQueueException msgQueueError)
                {
                    if (msgQueueError.Message == "Time out for the requested operation has expired.")
                    {
                        // No message found to process before TimeSpan expired
                        // {gulp} Swallow exception
                        return false;
                    }
                }
                catch (Exception e)
                {
                    Logger.LogDebug("Message failed");
                    TransactionAction transactionAction = TransactionAction.ROLLBACK;

                    if (message == null)
                    {
                        Logger.LogDebug("Message couldn't be received: " + e.Message);
                    }
                    else
                    {
                        try
                        {
                            transactionAction = failedMessageHandler.HandleFailedMessage(message, transaction);
                        }
                        catch (Exception failureHandlerException)
                        {
                            Logger.LogDebug("Error during failure handling: " + failureHandlerException.Message);
                        }
                    }

                    if (transactionAction == TransactionAction.ROLLBACK)
                    {
                        transaction.Abort();
                        Logger.LogDebug("Transaction rolled back");
                    }
                    else
                    {
                        transaction.Commit();
                        Logger.LogDebug("Transaction committed - message removed from queue");
                    }
                }
                return false;
            }
        }
コード例 #4
0
        private int ProcessMessages(msmq.MessageQueue queue, string retryQueueAddress, int messageMaxToProcessAtOneTime, IFailedMessageHandler failedMsgHandler)
        {
            int messageCount = 0;

            while (queue.CanRead && messageCount < messageMaxToProcessAtOneTime)
            {
                bool msgReceivedSuccess = ReceiveMessage(queue, failedMsgHandler);

                if (msgReceivedSuccess)
                {
                    messageCount++;
                }
                else
                {
                    return messageCount;
                }
            }
            return messageCount;
        }