Spring Retry中如何为不同的异常配置不同的延迟值?

问题描述

@Retryable(value = {SocketTimeoutException.class,AmazonServiceException.class},backoff = @Backoff(delayExpression = "${retry.delay:10000}"),maxAttemptsExpression = "${retry.max-attempts:4}")

对于SocketTimeoutException,我想将延迟设置为10000,但对于AmazonServiceException,我想将其设置为100。 有没有办法做到这一点?

谢谢

解决方法

我目前面临类似的问题,我找不到优雅的解决方案。以下是我认为可能对您有所帮助的解决方法:

@Retryable(value = {SocketTimeoutException.class},backoff = @Backoff(delayExpression = "${retry.delay:10000}"),maxAttemptsExpression = "${retry.max-attempts:4}")
void function1(){
   //do actual work here
}


@Retryable(value = {AmazonServiceException.class},backoff = @Backoff(delayExpression = "${retry.delay:100}"),maxAttemptsExpression = "${retry.max-attempts:4}")
void function2(){
   function1(); // call function1
}

调用 function2 来执行您的逻辑。这里的主要思想是从第一个函数中调用另一个函数,这两个函数配置了不同的 BackOff 延迟。

在某些情况下,这会在最大尝试值方面产生一些问题。具体来说,在最坏的情况下,总共可以尝试 8 次重试(4 + 4)。