我有以下重试策略,它使用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
}
);
Run Code Online (Sandbox Code Playgroud)
我想用断路器和隔板策略包装策略:
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
}
);
Run Code Online (Sandbox Code Playgroud)
我使用以下代码将策略包装在一起:
Policy.WrapAsync(retryPolicy, circuitBreaker, sharedBulkhead);
Run Code Online (Sandbox Code Playgroud)
这是一个错误: cannot convert from 'Polly.Retry.RetryPolicy<System.Net.Http.HttpResponseMessage>' to 'Polly.IAsyncPolicy'
当策略配置使用.HandleTransientHttpError()或 时.OrTransientHttpError(),策略被配置为处理执行返回的特定状态代码结果HttpResponseMessage。
这使得返回的策略满足泛型接口IAsyncPolicy<HttpResponseMessage>而不是非泛型IAsyncPolicy。
要PolicyWrap<TResult>使用PolicyWrap 静态语法创建泛型,您必须明确指定泛型类型参数:
Policy.WrapAsync<HttpResponseMessage>(retryPolicy, circuitBreaker, sharedBulkhead)
Run Code Online (Sandbox Code Playgroud)
如果使用PolicyWrap 实例语法,编译器通常可以推断语法。因此,以下内容也应该足够了:
retryPolicy.WrapAsync(circuitBreaker).WrapAsync(sharedBulkhead)
Run Code Online (Sandbox Code Playgroud)
Polly 文档一般在自述文件和wiki 中涵盖了非通用策略和通用策略之间的差异。
| 归档时间: |
|
| 查看次数: |
4294 次 |
| 最近记录: |