一、环境搭建
- 加入SpringRetry依赖,SpringRetry使用AOP实现,所以也需要加入AOP包
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</dependency>
二、RetryTemplate
2.1 RetryTemplate
- RetryTemplate封装了Retry基本操作
- org.springframework.retry.support.RetryTemplate
- RetryTemplate中可以指定监听、回退策略、重试策略等
- 只需要正常new RetryTemplate()即可使用
2.2 RetryListener
- RetryListener指定了当执行过程中出现错误时的回调
- org.springframework.retry.RetryListener
package org.springframework.retry;
public interface RetryListener {
<T, E extends Throwable> boolean open(RetryContext context, RetryCallback<T, E> callback);
<T, E extends Throwable> void close(RetryContext context, RetryCallback<T, E> callback, Throwable throwable);
<T, E extends Throwable> void onError(RetryContext context, RetryCallback<T, E> callback, Throwable throwable);
}
- 配置之后在RetryTemplate中指定
2.3 回退策略
2.3.1 FixedBackOffPolicy
- 当出现错误时延迟多少时间继续调用
FixedBackOffPolicy fixedBackOffPolicy = new FixedBackOffPolicy();
fixedBackOffPolicy.setBackOffPeriod(1000L);
retryTemplate.setBackOffPolicy(fixedBackOffPolicy);
- 配置之后在RetryTemplate中指定
2.3.2 ExponentialBackOffPolicy
- 当出现错误时第一次按照指定延迟时间延迟后按照指数进行延迟
ExponentialBackOffPolicy exponentialBackOffPolicy = new ExponentialBackOffPolicy();
exponentialBackOffPolicy.setInitialInterval(1000L);
exponentialBackOffPolicy.setMultiplier(2);
retryTemplate.setBackOffPolicy(exponentialBackOffPolicy);
- 配置之后在RetryTemplate中指定
2.4 重试策略
- 重试策略主要指定出现错误时重试次数
SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
retryPolicy.setMaxAttempts(5);
retryTemplate.setRetryPolicy(retryPolicy);
- 配置之后在RetryTemplate中指定
2.5 RetryCallback
- RetryCallback为retryTemplate.execute时执行的回调
- public final <T, E extends Throwable> T execute(RetryCallback<T, E> retryCallback) throws E
2.6 核心使用
- 可以使用RetryTemplate完成简单使用
- 配置retryTemplate
- 指定回退策略为ExponentialBackOffPolicy
- 指定重试策略为SimpleRetryPolicy
- 指定监听器RetryListener
import com.codecoord.util.PrintUtil;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.retry.RetryCallback;
import org.springframework.retry.RetryContext;
import org.springframework.retry.