Duration CalculateRetryTimeout(RetryProcessingState retryState) { var attempt = retryState?.RetryCount ?? 0 + 1; var seconds = Math.Min(attempt * 5, 60); return(Duration.FromTimeSpan(TimeSpan.FromSeconds(seconds))); }
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)); } }