Spring Boot重试机制怎么实现?@Retryable注解使用教程
当有些方法调用因为网络原因调用失败时往往需要重试机制。
1.通过while循环或者捕获异常后做处理。
2.使用spring提供的重试机制,这种方式的好处是基于AOP实现,没有代码入侵。
基于springBoot项目使用@Retryable注解实现重试
1.添加依赖
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>2.在启动类或者配置类上加@EnableRetry注解
启用这个功能
@EnableRetry
public class TestApplication {
public static void main(String[] args) {
try {
SpringApplication.run(TestApplication.class, args);
log.info("[启动成功]");
}catch (Exception e){
log.info("[启动失败]:{}",e);
}
}
}3.创建一个类
在需要重试的方法上添加注解
- @RetryablemaxAttempts:尝试次数 默认是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());
//记日志到数据库
}@Retryable注解使用需要注意的地方
1.由于是基于AOP实现,所以不支持类里自调用方法
2.如果重试失败需要给@Recover注解的方法做后续处理,那这个需要多次重试的方法不能有返回值,只能是void。否则重试结束后如果仍然失败也不会被指定方法处理
3.方法内不能使用try catch处理异常,即使使用了catch也要往外抛出异常

留言评论说文章写得有问题,贴一下测试代码
“方法所在的类不能是接口的实现类" 似乎是不成立,之前测试可能是因为@Recover注解的方法与重试方法不在同一类中导致重试完后没有被处理而是直接抛出了异常。
4.如果重试的方法有返回值,那么在重试次数用完后如果仍然失败也不会被@Recover注解的方法做处理。

5.如果重试方法中使用了try catch处理了异常而没有抛出去,那么重试不会起作用,第一次异常被处理后就不会再进行重试了

总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
SpringCloud Config统一配置中心问题分析解决与客户端动态刷新实现
springcloud config是一个解决分布式系统的配置管理方案。它包含了 client和server两个部分,server端提供配置文件的存储、以接口的形式将配置文件的内容提供出去,client端通过接口获取数据、并依据此数据初始化自己的应用2022-10-10
Java中基于注解的代码生成工具MapStruct映射使用详解
MapStruct 作为一个基于注解的代码生成工具,为我们提供了一种更加优雅、高效的解决方案,本文主要为大家介绍了它的具体使用,感兴趣的可以了解下2025-02-02
Java中Comparable接口和Comparator接口的使用比较
Java中提供了两种对集合或数组中元素进行排序的方法,一种是实现Comparable接口,另一种是实现Comparator接口,下面这篇文章主要给大家介绍了关于Java中Comparable接口和Comparator接口使用的相关资料,需要的朋友可以参考下2024-06-06
fasterxml jackson反序列化时对于非静态内部类报错问题及解决
这篇文章主要介绍了fasterxml jackson反序列化时对于非静态内部类报错问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2023-08-08
Spring Boot中实现全局Token验证的两种方式总结
这篇文章主要给大家介绍了关于Spring Boot中实现全局Token验证的两种方式,文中通过拦截器和过滤器实现全局Token验证,解决接口重复验证问题,对比两者优缺点及适用场景,提供统一异常处理方案,需要的朋友可以参考下2025-05-05
完美解决SpringCloud-OpenFeign使用okhttp替换不生效问题
这篇文章主要介绍了完美解决SpringCloud-OpenFeign使用okhttp替换不生效问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2021-02-02


最新评论