0

我想使用 Polly 来处理我需要进行的 HTTP API 调用的结果。我将政策定义为:

var r = await Policy
    .HandleResult<DescribeApplicationVersionsResponse>(x => x.ApplicationVersions[0]?.Status != ApplicationVersionStatus.Processed)
    .WaitAndRetryAsync(10, retryAttempt => TimeSpan.FromSeconds(1), onRetry: (describeResponse, timeSpan, context) => {
        Console.WriteLine($"Application version was '{describeResponse.Result.ApplicationVersions[0].Status}', retrying in {timeSpan}");
    })
    .ExecuteAsync(() =>
        BeanstalkClient.DescribeApplicationVersionsAsync(describeApplicationVersionRequest)
    );

如果策略从未成功(即从未满足结果标准并且已通过重试限制),我想抛出异常,因为我的应用程序无法继续。

是否可以通过 Polly 策略构建器扩展方法来定义它?

4

1 回答 1

3

如果为 Polly 重试策略配置的所有重试都已用尽,但执行的委托未成功,则重试策略将重新引发不允许再重试的异常,如Polly 自述文件(重试部分)和Polly 重试 wiki中所述。


如果您想抛出与从委托传播的异常不同的异常,您可以执行以下任何操作:

  • try/catch并抛出其他东西;(或者)
  • 使用 Polly.ExecuteAndCapture(...)捕获并检查最终执行结果,并抛出您自己的自定义异常;(或者)
  • 用于PolicyWrap包装FallbackPolicy重试策略之外,并在 FallbackPolicy 中处理重试失败的异常,并在回退操作中重新抛出不同的自定义异常。

已编辑:以反映 OP 的原始政策是处理结果而不是异常这一事实。使用FallbackPolicywith的方法PolicyWrap可能如下:

var retry = Policy
    .HandleResult<DescribeApplicationVersionsResponse>(x => x.ApplicationVersions[0]?.Status != ApplicationVersionStatus.Processed)
    .WaitAndRetryAsync(10, retryAttempt => TimeSpan.FromSeconds(1), onRetry: (describeResponse, timeSpan, context) => {
        Console.WriteLine($"Application version was '{describeResponse.Result.ApplicationVersions[0].Status}', retrying in {timeSpan}");
    });

var fallback = Policy
    .HandleResult<DescribeApplicationVersionsResponse>(x => x.ApplicationVersions[0]?.Status != ApplicationVersionStatus.Processed) // Probably worth factoring the predicate out into a method so that it is only stated once.
    .FallbackAsync(async () => { throw new ReplacementException(); });

var r = await fallback.WrapAsync(retry)
    .ExecuteAsync(() =>
   BeanstalkClient.DescribeApplicationVersionsAsync(describeApplicationVersionRequest)
);
于 2018-07-17T06:50:50.433 回答