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(); }
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)); }