4

在我的 SpringBoot 应用程序中,我有一个可以发送 POST 请求的客户端。在 POST 期间,它可能有几个例外。

如果出现 2 个不同的异常,我希望有一个重试逻辑。但在某种程度上,max-retry-attempts 应该对每个异常生效,而不是一起生效。很难解释,但举个例子:

max-retry-attempts 配置为 3。如果我得到 exception1 类型,而不是重试,我还有 2 次重试。再试一次,再次获得 exception1,然后重试,现在我还剩 1 次重试。再试一次,现在我得到了 exception2,然后再试一次,现在我还有 2 次重试,因为之前的重试是针对 exception1 而不是针对 exception2。所以exception2重试才刚刚开始。

可能吗?我尝试了这个,但这并没有从重试尝试开始,如果发生了异常1,然后发生了异常2,那么我还有1次重试:

@Retryable(maxAttempts = 3, value = {Exception1.class, Exception2.class}, backoff = @Backoff(delay = 3000, multiplier = 2))
4

2 回答 2

2

您必须创建自定义重试策略;并将其配置为RetryTemplateand RetryOperationsInterceptor;使用interceptor注解上的属性来引用拦截器。

于 2017-10-24T13:36:01.850 回答
1

我认为 @Retryable 注释不存在某些东西。如果您选择使用 RetryTemplate 实现,您可以使用以下内容对不同的异常进行不同的重试尝试,并将其设置到 RetryTemplate 对象中:

final SimpleRetryPolicy simpleRetryPolicyTenTimes = new SimpleRetryPolicy();
simpleRetryPolicyTenTimes.setMaxAttempts(10);
final SimpleRetryPolicy simpleRetryPolicyTwoTimes = new SimpleRetryPolicy();
simpleRetryPolicyTwoTimes.setMaxAttempts(2);
final Map<Class<? extends Throwable>, RetryPolicy> policyMap = new HashMap<>();
policyMap.put(RetryException.class, simpleRetryPolicyTenTimes);
policyMap.put(HardFailException.class, simpleRetryPolicyTwoTimes);
final ExceptionClassifierRetryPolicy retryPolicy = new ExceptionClassifierRetryPolicy();
retryPolicy.setPolicyMap(policyMap);
return retryPolicy;

您可以在此处找到示例: https ://www.programcreek.com/java-api-examples/index.php?api=org.springframework.retry.policy.ExceptionClassifierRetryPolicy

于 2018-12-12T12:00:24.883 回答