一、环境搭建
- 加入SpringRetry依赖,SpringRetry使用AOP实现,所以也需要加入AOP包
1 | xml复制代码<!-- SpringRetry --> |
二、RetryTemplate
2.1 RetryTemplate
- RetryTemplate封装了Retry基本操作
- org.springframework.retry.support.RetryTemplate
- RetryTemplate中可以指定监听、回退策略、重试策略等
- 只需要正常new RetryTemplate()即可使用
2.2 RetryListener
- RetryListener指定了当执行过程中出现错误时的回调
- org.springframework.retry.RetryListener
1 | java复制代码package org.springframework.retry; |
- 配置之后在RetryTemplate中指定
2.3 回退策略
2.3.1 FixedBackOffPolicy
- 当出现错误时延迟多少时间继续调用
1 | java复制代码FixedBackOffPolicy fixedBackOffPolicy = new FixedBackOffPolicy(); |
- 配置之后在RetryTemplate中指定
2.3.2 ExponentialBackOffPolicy
- 当出现错误时第一次按照指定延迟时间延迟后按照指数进行延迟
1 | java复制代码// 指数回退(秒),第一次回退1s,第二次回退2s,第三次4秒,第四次8秒 |
- 配置之后在RetryTemplate中指定
2.4 重试策略
- 重试策略主要指定出现错误时重试次数
1 | java复制代码// 重试策略 |
- 配置之后在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
1 | java复制代码import com.codecoord.util.PrintUtil; |
- 在controller中注入RetryTemplate使用,也可以是在service中
1 | java复制代码@RestController |
- 访问retry接口,然后观察日志输出
1 | java复制代码18:27:20.648 - http-nio-8888-exec-1 - open |
三、EnableRetry
- @EnableRetry开启重试,在类上指定的时候方法将默认执行,重试三次
- 定义service,开启@EnableRetry注解和指定@Retryable,重试可以参考后面一节
1 | java复制代码import org.springframework.retry.annotation.Retryable; |
1 | java复制代码import org.springframework.retry.annotation.EnableRetry; |
- controller中注入service
1 | java复制代码@RequestMapping("/retryAnnotation") |
- 将会默认重试
1 | java复制代码18:46:48.721 - http-nio-8888-exec-1 - 方法调用.. |
四、Retryable
- 用于需要重试的方法上的注解
- 有以下几个属性
- Retryable注解参数
- value:指定发生的异常进行重试
- include:和value一样,默认空,当exclude也为空时,所有异常都重试
- exclude:指定异常不重试,默认空,当include也为空时,所有异常都重试
- maxAttemps:重试次数,默认3
- backoff:重试补偿机制,默认没有
- @Backoff 注解 重试补偿策略
- 不设置参数时,默认使用FixedBackOffPolicy(指定等待时间),重试等待1000ms
- 设置delay,使用FixedBackOffPolicy(指定等待设置delay和maxDealy时,重试等待在这两个值之间均态分布)
- 设置delay、maxDealy、multiplier,使用 ExponentialBackOffPolicy(指数级重试间隔的实现),multiplier即指定延迟倍数,比如delay=5000L,multiplier=2,则第一次重试为5秒,第二次为10秒,第三次为20秒
- Retryable注解参数
1 | java复制代码@Target({ ElementType.METHOD, ElementType.TYPE }) |
1 | java复制代码@Target(ElementType.TYPE) |
- 在需要重试的方法上配置对应的重试次数、重试异常的异常类型、设置回退延迟时间、重试策略、方法监听名称
1 | java复制代码@Component |
1 | java复制代码// 初始延迟2秒,然后之后验收1.5倍延迟重试,总重试次数4 |
- 监听方法,在配置类中进行配置
1 | java复制代码/** |
- 调用服务
1 | java复制代码@RestController |
- 调用结果
本文转载自: 掘金