public async Task Process(IncomingStepContext context, Func <Task> next)
        {
            if (context.Load <bool>(SimpleRetryStrategyStep.DispatchAsFailedMessageKey))
            {
                var originalMessage = context.Load <Message>();

                var messageId            = originalMessage.GetMessageId();
                var fullErrorDescription = _errorTracker.GetFullErrorDescription(messageId) ?? "(not available in the error tracker!)";
                var exceptions           = _errorTracker.GetExceptions(messageId);
                var headers     = originalMessage.Headers;
                var body        = originalMessage.Body;
                var wrappedBody = WrapInFailed(headers, body, fullErrorDescription, exceptions);

                context.Save(new Message(headers, wrappedBody));
            }

            await next();
        }
Example #2
0
        private void _checkFinal(string messageId, int?transportDeliveryCount, bool beforeTry)
        {
            var exceptions = _errorTracker.GetExceptions(messageId);

            // +1 as DeliveryCount is 1-based and is charged prior to 'receive'
            var deliveryCountFromExceptions = exceptions.Count() + 1;

            // if transport doesn't has deliveryCount, use the count of the Exceptions.
            var deliveryCount = (transportDeliveryCount ?? 0) > deliveryCountFromExceptions ? transportDeliveryCount : deliveryCountFromExceptions;

            if (beforeTry == true)
            {
                deliveryCount--;
            }

            if ((deliveryCount >= _arkRetryStrategySettings.MaxDeliveryAttempts &&
                 exceptions.Any()) || exceptions.Any(x => _failFastChecker.ShouldFailFast(messageId, x)))
            {
                _errorTracker.MarkAsFinal(messageId);
            }
        }
 public IEnumerable <Exception> GetExceptions(string messageId)
 {
     return(_innerErrorTracker.GetExceptions(messageId));
 }