Spring @Retryable中针对不同异常的不同重试尝试

时间:2017-10-24 13:19:48

标签: spring spring-retry

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

我想在2个不同的例外情况下有一个重试逻辑。但是,最大重试尝试应该对每个异常生效,而不是一起生效。很难解释,但一个例子:

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

有可能吗?我尝试了这个,但是这不会重试尝试不同的异常,如果发生了exception1然后发生了exception2,那么我还剩1次重试:

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我认为@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