private static int GetMessageRetryCount(IAzureMessage message) { var messageRetryCount = 0; if (message.Properties.ContainsKey(RetryCountKey)) { messageRetryCount = ParseInt(message.Properties[RetryCountKey]); } return(messageRetryCount); }
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); }