基于SpringBoot的@Retryable注解通过AOP实现重试机制,需添加依赖并启用@EnableRetry。注解可配置重试次数、退避策略及异常类型,重试失败后由@Recover方法统一处理。需注意不支持类内自调用,重试方法不能有返回值,且异常必须抛出。
当方法调用因网络原因失败时,通常需要一套重试机制作为兜底。最直接的做法是使用 while 循环或在捕获异常后手动处理,但这种方式代码侵入性较强。Spring 框架基于 AOP 提供了 @Retryable 注解来实现重试,零侵入,更加优雅。
org.springframework.retry spring-retry
启用该功能并不复杂,直接添加注解即可:
长期稳定更新的攒劲资源: >>>点此立即查看<<<
@EnableRetry
public class TestApplication {
public static void main(String[] args) {
try {
SpringApplication.run(TestApplication.class, args);
log.info("[启动成功]");
}catch (Exception e){
log.info("[启动失败]:{}",e);
}
}
}
@Retryable 的 maxAttempts:最大尝试次数,默认为 3(注意这 3 次包含第一次执行)。backoff:可指定暂停时间,其中 multiplier 为递增指数,当 maxAttempts 大于 2 时生效。value:指定触发重试的异常类型。 @Retryable(value = Exception.class, maxAttempts = 3, backoff = @Backoff(delay = 2000, multiplier = 1.5))
public void cacheProduct(String productCode) throws Exception {
}
// 在指定次数尝试后仍然失败,则由同一类中的 @Recover 注解方法做统一处理(类似全局异常处理)
// 注意:该方法也不能有返回值
@Recover
public void recover(Exception e) {
logger.warn("减库存失败!!!" + LocalTime.now());
// 记录日志到数据库
}
1. 由于基于 AOP 实现,不支持类内部的自调用(即同一类中的方法调用另一个方法,AOP 不会生效)。
2. 如果重试失败后需要由 @Recover 注解的方法做后续处理,那么被重试的方法不能有返回值,必须是 void。否则重试结束后即使失败,也不会被 @Recover 方法处理。
3. 方法内不能使用 try catch 处理异常,即使使用了 catch 也要向外抛出异常,否则重试机制无法感知异常。

有读者留言说文章写得有问题,这里贴出测试代码说明。之前提到的“方法所在的类不能是接口的实现类”似乎不成立,后来测试发现可能是 @Recover 注解的方法与重试方法不在同一类中,导致重试完成后未被处理,而直接抛出异常。
4. 如果重试方法有返回值,那么在重试次数用完后仍然失败,也不会被 @Recover 注解的方法处理。

5. 如果重试方法中使用 try catch 处理了异常而未抛出,那么重试不会生效——第一次异常被处理后,不会再进行重试。

以上是 Spring Boot 中 @Retryable 注解的基本用法和常见陷阱。核心思路很简单:通过注解声明式地控制重试次数、退避策略和异常类型,失败后由 @Recover 统一兜底。但需要注意 AOP 的局限性、返回值类型以及异常处理方式,否则容易踩坑。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述