Код: Выделить всё
var pipelineBuilder = new ResiliencePipelineBuilder();
(Orders.Contracts.OrderView?, RequestResult) outerTempResult = new(null, new()); // A non-empty temp result for fallbacks.
var pipeline = pipelineBuilder
.AddFallback(new()
{
ShouldHandle = new PredicateBuilder().Handle(),
FallbackAction = args => Outcome.FromResultAsValueTask(outerTempResult),
})
.AddTimeout(TimeSpan.FromMilliseconds(options.MaxPollingTimeout)) // Global timeout for the entire pipeline
.AddRetry(new RetryStrategyOptions
{
ShouldHandle = new PredicateBuilder()
.HandleResult(newOrder => newOrder.Item1 == null || newOrder.Item1.Status == S4.Orders.Contracts.OrderStatus.InProgress),
Delay = TimeSpan.FromMilliseconds(OrderSettings.RetryInterval),
MaxRetryAttempts = OrderSettings.RetryCount,
BackoffType = DelayBackoffType.Linear,
UseJitter = true,
OnRetry = (args) =>
{
outerTempResult = args.Outcome.Result; // Assign this to an outer variable to use in the fallback handling callback.
return ValueTask.CompletedTask;
}
})
.Build();
< /code>
и выполнение запроса выглядит следующим образом: < /p>
var orderView = await pipeline.ExecuteAsync(async token =>
{
return await this.orderServiceClient.GetOrderAsync(id);
}, CancellationToken.None);
return orderView.Item2.ToApiResult();
Подробнее здесь: https://stackoverflow.com/questions/796 ... t-strategy