Как использовать перенос политики на RetryPolicy<HttpResponseMessage>?
У меня есть следующая политика повтора, которая использует Polly.Extensions.Http
:
var retryPolicy = Policy.Handle<BrokenCircuitException>().OrTransientHttpError().WaitAndRetryAsync
(
retryCount: maxRetryCount,
sleepDurationProvider: attempt => TimeSpan.FromSeconds(Math.Pow(2, attempt)),
onRetryAsync: (exception, calculatedWaitDuration, retryCount, context) =>
{
//Code
}
);
Я хочу обернуть политику политиками автоматического выключателя и перегрузки:
var circuitBreaker = Policy.Handle<HttpRequestException>().CircuitBreakerAsync(
exceptionsAllowedBeforeBreaking: maxExceptionsBeforeBreaking,
durationOfBreak: TimeSpan.FromSeconds(circuitBreakDurationSeconds),
onBreak: (exception, timespan, context) =>
{
//Code
},
onReset: (context) =>
{
//Code
}
);
var sharedBulkhead = Policy.BulkheadAsync(
maxParallelization: maxParallelizations,
maxQueuingActions: maxQueuingActions,
onBulkheadRejectedAsync: (context) =>
{
//Code
}
);
Я использую следующий код для объединения политик:
Policy.WrapAsync(retryPolicy, circuitBreaker, sharedBulkhead);
Это дает ошибку: cannot convert from 'Polly.Retry.RetryPolicy<System.Net.Http.HttpResponseMessage>' to 'Polly.IAsyncPolicy'
1 ответ
Когда конфигурация политики использует .HandleTransientHttpError()
или же.OrTransientHttpError()
политики настроены для обработки определенных результатов кода состояния при возврате выполнения HttpResponseMessage
,
Это делает возвращенные политики типа, который выполняет универсальный интерфейс IAsyncPolicy<HttpResponseMessage>
а не неуниверсальный IAsyncPolicy
,
Создать общий PolicyWrap<TResult>
используя статический синтаксис PolicyWrap, вы должны явно указать параметр универсального типа:
Policy.WrapAsync<HttpResponseMessage>(retryPolicy, circuitBreaker, sharedBulkhead)
Если вы используете синтаксис экземпляра PolicyWrap, компилятор обычно может определить синтаксис. Таким образом, следующего также должно быть достаточно:
retryPolicy.WrapAsync(circuitBreaker).WrapAsync(sharedBulkhead)
Документация Polly охватывает различия между неуниверсальными и универсальными политиками, как правило, в readme и вики.