一个Spring注解轻松搞定循环重试功能!

前言 在实际工作中,重处理是一个非常常见的场景,比如:
发送消息失败。 调用远程服务失败。 争抢锁失败。 这些错误可能是因为网络波动造成的,等待过后重处理就能成功。通常来说,会用try/catch,while循环之类的语法来进行重处理,但是这样的做法缺乏统一性,并且不是很方便,要多写很多代码。然而spring-retry却可以通过注解,在不入侵原有业务逻辑代码的方式下,优雅的实现重处理功能。
基于 spring boot + mybatis plus + vue & element 实现的后台管理系统 + 用户小程序,支持 rbac 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
项目地址:https://github.com/yunaiv/ruoyi-vue-pro 视频教程:https://doc.iocoder.cn/video/ @retryable是什么? spring系列的spring-retry是另一个实用程序模块,可以帮助我们以标准方式处理任何特定操作的重试。在spring-retry中,所有配置都是基于简单注释的。
基于 spring cloud alibaba + gateway + nacos + rocketmq + vue & element 实现的后台管理系统 + 用户小程序,支持 rbac 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
项目地址:https://github.com/yunaiv/yudao-cloud 视频教程:https://doc.iocoder.cn/video/ 使用步骤 pom依赖    org.springframework.retry  spring-retry  启用@retryable @enableretry@springbootapplicationpublic class helloapplication {    public static void main(string[] args) {        springapplication.run(helloapplication.class, args);    }} 在方法上添加@retryable import com.mail.elegant.service.testretryservice;import org.springframework.retry.annotation.backoff;import org.springframework.retry.annotation.retryable;import org.springframework.stereotype.service;import java.time.localtime; @servicepublic 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重试失败后处理方法。如果不需要回调方法,可以直接不写回调方法,那么实现的效果是,重试次数完了后,如果还是没成功没符合业务判断,就抛出异常。
@recover @recoverpublic int recover(exception e, int code){   system.out.println(回调方法执行!!!!);   //记日志到数据库 或者调用其余的方法    return 400;} 可以看到传参里面写的是 exception e,这个是作为回调的接头暗号(重试次数用完了,还是失败,我们抛出这个exception e通知触发这个回调方法)。对于@recover注解的方法,需要特别注意的是:
方法的返回值必须与@retryable方法一致 方法的第一个参数,必须是throwable类型的,建议是与@retryable配置的异常一致,其他的参数,需要哪个参数,写进去就可以了(@recover方法中有的) 该回调方法与重试方法写在同一个实现类里面 注意事项 由于是基于aop实现,所以不支持类里自调用方法 如果重试失败需要给@recover注解的方法做后续处理,那这个重试的方法不能有返回值,只能是void 方法内不能使用try catch,只能往外抛异常 @recover注解来开启重试失败后调用的方法(注意,需跟重处理方法在同一个类中),此注解注释的方法参数一定要是@retryable抛出的异常,否则无法识别,可以在该方法中进行日志处理。 总结 本篇主要简单介绍了springboot中的retryable的使用,主要的适用场景和注意事项,当需要重试的时候还是很有用的。


华硕推出ROG Strix XG248Q,23.8寸大小,为顶级游戏玩家打造
关于嵌入式Linux项目开发内容
马斯克身家暴跌 3天蒸发210亿美元 特斯拉股价还将持续下跌
PCB技术的发展现状与未来趋势分析
继iPhone13出现bug后iPhone13被曝拍照有马赛克
一个Spring注解轻松搞定循环重试功能!
基于AVR单片机的LED显示屏的灰度设计与实现
使用全球SIP中继增强CCaaS的5个好处
不一样的自动驾驶技术与无人驾驶技术
手机干扰电路分享
苹果iPhone 12破发成无意义的闹剧,要想降价还得等三年
首代iPhone发布前乔布斯临时决定加入谷歌地图
零售商可以利用AI来解锁并充分利用其数据宝库
如何突破LED照明电源安规瓶颈
基于CPLD的ST-BUS总线收发模块设计
美国高通技术公司推出首款用于移动计算产品的4G LTE Advanced嵌入式连接平台
常见的LED显示屏有哪几种
TE推出Economy Power 2.5系列三款全新连接器
相变化内存原理分析及设计使用技巧
在系统设计中添加“黑盒子”故障记录议