首页  编辑  

Spring Retry: 异常后的自动重试

Tags: /Java/   Date Created:
Spring中,调用API或者某些操作后,如果失败,那么整个方法如果需要自动重试,可以使用 Spring Retry 实现。
  • 添加dependency
<dependency>
 	<groupId>org.springframework.retry</groupId>
	<artifactId>spring-retry</artifactId>
 	<version>1.3.4</version>
 	<scope>compile</scope>
</dependency>
<dependency>
 	<groupId>org.aspectj</groupId>
 	<artifactId>aspectjweaver</artifactId>
 	<version>1.9.7</version>
 	<scope>compile</scope>
</dependency>
  •  enable retry
@Configuration
@EnableRetry
public class RetryConfig {
}
  • 添加重试的全局参数配置
在application.yml中添加配置,作用在第4节中由解释
retry:
  maxAttempts: 3
  delay: 3000
  multiplier: 0
  • 在需要重试得方法上添加spring retry 注解
@Retryable(
            recover = "baseCallApi",
            value = {Exception.class},
            maxAttemptsExpression = "${retry.maxAttempts}",
            backoff = @Backoff(
                    delayExpression = "${retry.delay}",
                    multiplierExpression = "${retry.multiplier}"
            )
    )
public xxDTO callApiWithRetry() {}
1. recover: 所有次數都重試完后, 進入baseCallApi, baseCallApi上用@Recover标注
2. value: 指定異常類型時,才進入重試, 可以指定多个异常类型
3. maxAttemptsExpression: 最大重試次數
4. delayExpression: 間隔
5. multiplierExpression: 冪運算的初始值,作爲乘數計算下一次的延時時間: delay = delay * multiplier
e.g. delay = 200, multiplier=1.5
第一次重試 delay = 200 * 1.5 (300)
第二次: delay = 300 * 1.5 (450)
.....
所有重试次数用完后进入的方法
@Recover
private xxDTO baseCallApi(Throwable cause) {
}
此方法中用于所有重试次数都用完还没有成功的后续处理,比如可以记录一下等级比较严重的Als日志,或者保存一些数据库记录啥的。。。
  • Tips
1. 調用重試方法的類與重試方法不能在同一個類中 (因爲它是基於类AOP代理,不是基于方法AOP代理,参考@Transactional注解的使用)
2. @Recover注解修飾的方法的入參,需和重試的方法入参保持一致,除了第一個參數必須為Throwable 以外