求求你们了,别再重复造轮子了,一个 Spring 注解轻松搞定循环重试功能!()

  本篇文章为你整理了求求你们了,别再重复造轮子了,一个 Spring 注解轻松搞定循环重试功能!()的详细内容,包含有 求求你们了,别再重复造轮子了,一个 Spring 注解轻松搞定循环重试功能!,希望能帮助你了解 求求你们了,别再重复造轮子了,一个 Spring 注解轻松搞定循环重试功能!。

  分享Java技术,高并发编程,分布式技术,架构设计,Java面试题,算法,行业动态,程序人生等。

  
 

  在实际工作中,重处理是一个非常常见的场景,比如:

  发送消息失败。

  调用远程服务失败。

  争抢锁失败。

  这些错误可能是因为网络波动造成的,等待过后重处理就能成功。通常来说,会用try/catch,while循环之类的语法来进行重处理,但是这样的做法缺乏统一性,并且不是很方便,要多写很多代码。然而spring-retry却可以通过注解,在不入侵原有业务逻辑代码的方式下,优雅的实现重处理功能。

  一、@Retryable是什么?

  spring系列的spring-retry是另一个实用程序模块,可以帮助我们以标准方式处理任何特定操作的重试。在spring-retry中,所有配置都是基于简单注释的。

  二、使用步骤

  1.POM依赖

  

 dependency 

 

   groupId org.springframework.retry /groupId

   artifactId spring-retry /artifactId

   /dependency

  

 

  推荐一个开源免费的 Spring Boot 最全教程:

  https://github.com/javastacks/spring-boot-best-practice

  2.启用@Retryable

  

@EnableRetry

 

  @SpringBootApplication

  public class HelloApplication {

   public static void main(String[] args) {

   SpringApplication.run(HelloApplication.class, args);

  

 

  3.在方法上添加@Retryable

  

@Service

 

  public class TestRetryServiceImpl implements TestRetryService {

   @Override

   @Retryable(value = Exception.class,maxAttempts = 3,backoff = @Backoff(delay = 2000,multiplier = 1.5))

   public int test(int code) throws Exception{

   System.out.println("test被调用,时间:"+LocalTime.now());

   if (code==0){

   throw new Exception("情况不对头!");

   System.out.println("test被调用,情况对头了!");

   return 200;

  

 

  来简单解释一下注解中几个参数的含义:

  value:抛出指定异常才会重试

  include:和value一样,默认为空,当exclude也为空时,默认所有异常

  exclude:指定不处理的异常

  maxAttempts:最大重试次数,默认3次

  backoff:重试等待策略,默认使用@Backoff,@Backoff的value默认为1000L,我们设置为2000L;multiplier(指定延迟倍数)默认为0,表示固定暂停1秒后进行重试,如果把multiplier设置为1.5,则第一次重试为2秒,第二次为3秒,第三次为4.5秒。

  当重试耗尽时还是失败,会出现什么情况呢?

  当重试耗尽时,RetryOperations可以将控制传递给另一个回调,即RecoveryCallback。Spring-Retry还提供了@Recover注解,用于@Retryable重试失败后处理方法。如果不需要回调方法,可以直接不写回调方法,那么实现的效果是,重试次数完了后,如果还是没成功没符合业务判断,就抛出异常。

  4.@Recover

  

@Recover

 

  public int recover(Exception e, int code){

   System.out.println("回调方法执行!!!!");

   //记日志到数据库 或者调用其余的方法

   return 400;

  

 

  可以看到传参里面写的是 Exception e,这个是作为回调的接头暗号(重试次数用完了,还是失败,我们抛出这个Exception e通知触发这个回调方法)。对于@Recover注解的方法,需要特别注意的是:

  方法的返回值必须与@Retryable方法一致

  方法的第一个参数,必须是Throwable类型的,建议是与@Retryable配置的异常一致,其他的参数,需要哪个参数,写进去就可以了(@Recover方法中有的)

  该回调方法与重试方法写在同一个实现类里面

  5. 注意事项

  由于是基于AOP实现,所以不支持类里自调用方法

  如果重试失败需要给@Recover注解的方法做后续处理,那这个重试的方法不能有返回值,只能是void

  方法内不能使用try catch,只能往外抛异常

  @Recover注解来开启重试失败后调用的方法(注意,需跟重处理方法在同一个类中),此注解注释的方法参数一定要是@Retryable抛出的异常,否则无法识别,可以在该方法中进行日志处理。

  本篇主要简单介绍了Springboot中的Retryable的使用,主要的适用场景和注意事项,当需要重试的时候还是很有用的。

  版权声明:本文为CSDN博主「Memory小峰」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/h254931252/article/details/109257998

  近期热文推荐:

  1.1,000+ 道 Java面试题及答案整理(2022最新版)

  2.劲爆!Java 协程要来了。。。

  3.Spring Boot 2.x 教程,太全了!

  4.别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!

  5.《Java开发手册(嵩山版)》最新发布,速速下载!

  觉得不错,别忘了随手点赞+转发哦!

  以上就是求求你们了,别再重复造轮子了,一个 Spring 注解轻松搞定循环重试功能!()的详细内容,想要了解更多 求求你们了,别再重复造轮子了,一个 Spring 注解轻松搞定循环重试功能!的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: