重试在功能设计上需要根据应用场景进行设计,读数据的接口比较适合重试的场景,写数据的接口就需要注意接口的幂等性了,还有就是重试次数如果太多的话会导致请求量加倍,给后端造成更大的压力,设置合理的重试机制是关键;
spring retry重试框架
spring boot使用spring retry重试机制
1.pom引用
<dependency> <groupid>org.springframework.retry</groupid> <artifactid>spring-retry</artifactid> </dependency>
2.应用启动类开启retry
@enableretry public class application { ....... }
3.在指定方法上标记@retryable来开启重试
@retryable(value={runtimeexception.class},maxattempts=5,backoff = @backoff(delay = 2000,multiplier = 1.5)) public void retrytest() throws exception { system.out.println(thread.currentthread().getname()+" do something..."); throw new runtimeexception(); }
value: 指定发生的异常进行重试
include: 和value一样,默认空,当exclude也为空时,所有异常都重试
exclude: 指定异常不重试,默认空,当include也为空时,所有异常都重试
maxattemps: 重试次数,默认3
backoff: 重试补偿机制,默认没有
4.在指定方法上标记@recover来开启重试失败后调用的方法(注意,需跟重处理方法在同一个类中)
@recover public void recover(runtimeexception e) { // ... do something }
使用详解
spring-retry通过aop实现对目的方法的封装,执行在当前线程下,所以重试过程中当前线程会堵塞。如果backoff时间设置比较长,最好起异步线程重试(也可以加@async注解)。
@retryable注解
被注解的方法发生异常时会重试
value:指定发生的异常进行重试
include:和value一样,默认空,当exclude也为空时,所有异常都重试
exclude:指定异常不重试,默认空,当include也为空时,所有异常都重试
maxattemps:重试次数,默认3
backoff:重试补偿机制,默认没有
@backoff注解
delay:指定延迟后重试
multiplier:指定延迟的倍数,比如delay=5000l,multiplier=2时,第一次重试为5秒后,第二次为10秒,第三次为20秒
@recover
当重试到达指定次数时,被注解的方法将被回调,可以在该方法中进行日志处理。需要注意的是发生的异常和入参类型一致时才会回调
spring-retry踩坑
一、@retryable未生效可能原因
@retryable方法必须为 public
下面情况下@retryable不生效,即重试方法与调用它的非重试方法在同一个类中。
// 注意 此方法不生效!!! @enableretry(proxytargetclass = true) class test{ public void methoda(){ methodb(); } @retryable public void methodb(){ } }
解决方案:将重试方法单独写了一个service。
3.每个类中对一种异常只有一个重试方法。两个重试方法捕捉exception,重试失效。
二、@recover未生效可能原因
①返回值必须和被重试的函数返回值一致;
②参数中除了第一个是触发的异常外,后面的参数需要和被重试函数的参数列表一致;
③当然这里的返回值部分也可以再做一次手动重试,但是已经尝试那么多次都失败了,所以在兜底函数中再做一次也意义不大。因此我的考虑是,这里就用来做日志记录就好。
以上就是springboot使用spring retry重试机制的操作详解的详细内容,更多关于springboot使用spring retry的资料请关注代码网其它相关文章!
发表评论