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

SpringBoot有注解来处理重试机制,再优雅不过了,..

时间:2023-04-01 15:45:23 Java

来源:blog.csdn.net/h254931252/article/details/109257998前言在实际工作中,重新处理是一个很常见的场景,比如:发送消息失败。调用远程服务失败。争用锁失败。这些错误可能是网络波动造成的,等待重新处理会成功。一般来说,再处理都是使用try/catch、while循环等语法,但是这种方式缺乏统一性,也不是很方便,需要写很多代码。而spring-retry可以在不侵入原有业务逻辑代码的情况下,通过注解优雅的实现再处理功能。1.什么是@Retryable?spring系列的spring-retry是另一个实用程序模块,可帮助我们以标准方式处理任何特定操作的重试。在spring-retry中,所有的配置都是基于简单的注解。二、使用步骤1、POM依赖org.springframework.retryspring-retry2、启用@RetryableSpringBoot基础的就不介绍了,推荐下载这个实用教程:https://github.com/javastacks...@EnableRetry@SpringBootApplicationpublicclassHelloApplication{publicstaticvoidmain(String[]args){SpringApplication.run(HelloApplication.class,args);}}3。在importcom.mail.elegant.service.TestRetryService;importorg.springframework.retry.annotation.Backoff;importorg.springframework.retry.annotation.Retryable;importorg.springframework.stereotype.Service;importjava方法上添加@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:仅在抛出指定异常时重试include:与value相同,默认为空,当exclude也为空时,默认所有异常exclude:指定异常maxAttempts:最大重试次数,默认3次multiplier(指定延迟倍数)默认为0,表示固定暂停1秒后重新尝试,如果multiplier设置为1.5,第一次重试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的使用,主要适用场景及注意事项,在需要重试的时候还是很有用的。近期热点文章推荐:1.1000+Java面试题及答案(2022最新版)2.厉害了!Java协程来了。..3.SpringBoot2.x教程,太全面了!4.不要用爆破爆满画面,试试装饰者模式,这才是优雅的方式!!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!