Ejemplo n.º 1
0
        Duration CalculateRetryTimeout(RetryProcessingState retryState)
        {
            var attempt = retryState?.RetryCount ?? 0 + 1;
            var seconds = Math.Min(attempt * 5, 60);

            return(Duration.FromTimeSpan(TimeSpan.FromSeconds(seconds)));
        }
Ejemplo n.º 2
0
        async Task <TResponse> CatchingHandle(TRequest request, CancellationToken cancellationToken)
        {
            RetryProcessingState retryState = null;

            try
            {
                retryState = GetRetryProcessingState(request);
                return(await Handle(request, cancellationToken).ConfigureAwait(false));
            }
            catch (Exception ex)
            {
                while (ex.InnerException != null)
                {
                    ex = ex.InnerException;
                }

                var failure = new ProcessorFailure
                {
                    Reason       = ex.Message,
                    Retry        = true,
                    RetryTimeout = CalculateRetryTimeout(retryState),
                };

                _logger.Warning(ex, "Processing in {Kind} {Id} failed. Will retry in {RetryTimeout} seconds.", Kind, Identifier, failure.RetryTimeout.Seconds);

                return(CreateResponseFromFailure(failure));
            }
        }