当前位置: 首页 > 后端技术 > Java

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

时间:2023-04-01 23:17:57 Java

在实际工作中,重新处理是很常见的场景,比如:发送消息失败。调用远程服务失败。争用锁失败。这些错误可能是网络波动造成的,等待重新处理会成功。一般来说,再处理都是使用try/catch、while循环等语法,但是这种方式缺乏统一性,也不是很方便,需要写很多代码。而spring-retry可以在不侵入原有业务逻辑代码的情况下,通过注解优雅的实现再处理功能。1.什么是@Retryable?spring系列的spring-retry是另一个实用程序模块,可帮助我们以标准方式处理任何特定操作的重试。在spring-retry中,所有的配置都是基于简单的注解。2.Step1.POM依赖org.springframework.retryspring-retry推荐一个开源免费的SpringBoot最全教程:https://github.com/javastacks/spring-boot-best-practice2.启用@Retryable@EnableRetry@SpringBootApplicationpublicclassHelloApplication{publicstaticvoidmain(String[]args){SpringApplication.run(HelloApplication.class,args);}}3.添加@Retryable@ServicepublicclassTestRetryServiceImplimplementsTestRetryService{@Override@Retryable(value=Exception.class,maxAttempts=3,backoff=@Backoff(delay=2000,multiplier=1.5))publicinttest(intcode)throwsException{System.out.println("测试被调用,时间:"+LocalTime.now());if(code==0){thrownewException("出问题了!");}System.out.println("测试被调用,情况正确!");返回200;}}简单解释一下注解中几个参数的含义:value:throwthespecifiedexceptiontoretryininclude:同value,默认为空,当exclude也为空时,默认所有异常exclude:指定不处理的异常maxAttempts:最大重试次数,默认3次backoff:重试等待策略,使用@Backoff,@bydefaultBackoff的值默认为1000L,我们设置为2000L;multiplier(指定延迟倍数)默认为0,表示固定暂停1秒,然后重试。如果倍数设置为1.5,第一次重试2秒,第一次重试2秒。第二次是3秒,第三次是4.5秒。当重试次数用尽时,它仍然失败。会发生什么?当重试次数耗尽时,RetryOperations可以将控制权传递给另一个回调,即RecoveryCallback。Spring-Retry还为@Retryable重试失败后处理方法提供了@Recover注解。如果不需要回调方法,可以直接不写回调方法,那么效果就是重试次数结束后,如果仍然不满足业务判断,则抛出异常。4.@Recover@Recoverpublicintrecover(Exceptione,intcode){System.out.println("回调方法执行!!!!");//记录日志到数据库或者调用其他方法return400;}可以看到传入的参数中写了Exceptione,作为回调的连接代码(重试次数已经用完了,还是失败,我们抛出这个Exceptione通知来触发回调方法)。对于@Recover注解的方法,要特别注意:方法的返回值必须和@Retryable方法保持一致。该方法的第一个参数必须是Throwable类型。建议与@Retryable配置的异常保持一致。其他参数,需要哪个参数,写在(@Recover方法中)即可。回调方法和重试方法写在同一个实现类中。5、注意事项由于是基于AOP实现,不支持类中的自调用方法如果重试失败,需要对@Recover注解的方法做后续处理。那么重试方法不能有返回值。它只能在void方法中使用trycatch,只能抛出一个异常@Recover注解来开启失败重试。要调用的方法(注意必须和再处理方法在同一个类),这个注解所注解的方法参数必须是@Retryable抛出的异常,否则无法识别,日志处理可以在这个方法。本文主要简单介绍了Springboot中Retryable的使用,主要适用场景和注意事项,在需要重试的时候还是很有用的。版权声明:本文为CSDN博主“记忆小风”原创文章,遵循CC4.0BY-SA版权协议。转载请附上原文出处链接及本声明。