在我的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))
答案 0 :(得分:1)
您必须创建自定义重试策略;并将其配置为RetryTemplate
和RetryOperationsInterceptor
;使用注释上的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;