Пример #1
0
        private static int GetMessageRetryCount(IAzureMessage message)
        {
            var messageRetryCount = 0;

            if (message.Properties.ContainsKey(RetryCountKey))
            {
                messageRetryCount = ParseInt(message.Properties[RetryCountKey]);
            }

            return(messageRetryCount);
        }
Пример #2
0
        public object ProcessMessage(IAzureMessage message)
        {
            IMessage <T> body        = null;
            string       messageBody = null;

            object result = null;

            try
            {
                try
                {
                    messageBody = message.GetBody <string>();
                    body        = messageBody.DeserializeToMessage <T>();
                }
                catch (Exception e)
                {
                    Log.Error(string.Format("Unable to get message body. {0}: {1}", e.GetType().Name, e.Message), e);
                    throw;
                }

                result = processMessageFn(body);

                message.Complete();

                if (result != null && result.GetType().IsClass)
                {
                    //TODO: in the future add result to out queue
                }
            }
            catch (Exception ex)
            {
                Log.Error(string.Format("Unable process message. {0}: {1}", ex.GetType().Name, ex.Message), ex);

                try
                {
                    TotalMessagesFailed++;

                    var enqueAfter = settings.IntervalBetweenRetries;

                    if (enqueAfter.HasValue)
                    {
                        var messageRetryCount = GetMessageRetryCount(message) + 1;
                        var enqueIn           = enqueAfter.Value;

                        if (settings.DuplicateIntervalWithEachRetry)
                        {
                            enqueIn = enqueIn.IncreaseEnqueTime(messageRetryCount);
                        }

                        if (settings.MaxIntervalBetweenRetries.HasValue && enqueIn > settings.MaxIntervalBetweenRetries.Value)
                        {
                            enqueIn = settings.MaxIntervalBetweenRetries.Value;
                        }

                        if (messageRetryCount > retryCount)
                        {
                            message.DeadLetter("RetryCountOver" + retryCount, ex.GetType().Name + ": " + ex.Message);
                        }
                        else
                        {
                            DelayMessageProcessing(messageBody, enqueIn, messageRetryCount, ex);

                            // Remove current message:
                            message.Complete();
                        }
                    }
                    else
                    {
                        // Put back into the queue:
                        message.Abandon();
                    }

                    if (processExceptionFn != null)
                    {
                        processExceptionFn(body, ex);
                    }
                }
                catch (Exception exWhileProcessing)
                {
                    Log.Error("Message exception handler threw an error", exWhileProcessing);
                }
            }

            return(result);
        }