零侵入SpringBoot搞定,服务重试
在实际工作中,重处理是一个非常常见的场景,比如: 发送消息失败。 SpringBoot 调用远程服务失败。 争抢锁失败。
这些错误可能是因为网络波动造成的,等待过后重新处理就能成功。通常来说,会用 try/catch ,while 循环之类的语法来进行重处理,但是这样的做法缺乏统一性,并且不是很方便,要多写很多代码。然而spring-retry 却可以通过注解,在不入侵原有业务逻辑代码的方式下,优雅地实现重处理功能。 一、@Retryable是什么?
Spring系列的 spring-retry 是另一个实用程序模块,可以帮助我们以标准方式处理任何特定操作的重试。在spring-retry 中,所有配置都是基于简单注释的。 二、使用步骤1.POM依赖 org.springframework.retry spring-retry 2.启用@Retryable@EnableRetry @SpringBootApplication public class HelloApplication { public static void main(String[] args) { SpringApplication.run(HelloApplication.class, args); } } 3.在方法上添加@Retryableimport 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; @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 的使用,主要的适用场景和注意事项,当需要重试的时候还是很有用的。
荣耀9X,荣耀中端机的巅峰之作如果你问我,令人最满意的中端机是哪一台,我会毫不犹豫地回答,荣耀9X。因为它的性能外观价格都很完美。如今,相信很多人都在用这个手机,因为这个手机的性能与配置尚未落后。荣耀9X于20
2022年3月笔记本轻薄本全能本推荐想入手一台笔记本,平时主要办公用,最主要的是追剧,也会用cad,3dmax,ps,pr,ai之类软件。想要看剧爽,清晰度高,最好2k,在高分辨率的同时希望处理器显卡性能可以跟上,亮
身价千亿的京东副总裁患绝症!曾砸千万求医,3年过去治好了吗?大家好,我是腾飞。京东副总裁蔡磊亿万身家却在2019年查出患了绝症渐冻症,砸巨款与命运对抗,如今三年过去了,他怎么样了?他在确诊绝症后的努力又能带给我们什么样的启示呢?蔡磊是谁在2
为什么95以上的摄影器材都是日本制造的?这个话题真是让国人感到伤心啊,我们先回顾中国现代化相机生产的历史。一在1955年,北京的大来精机厂以前苏联的卓尔基(Zorki)135旁轴相机为原型,研发出12台样机,那么这算得上
以精准监管让恶意弹窗广告不再任性国家互联网信息办公室2日公布互联网弹窗信息推送服务管理规定(征求意见稿),并向社会公开征求意见。征求意见稿明确,弹窗推送广告信息,必须进行内容合规审查,不得违反国家相关法律法规应当
转转上买二手iPad靠谱吗?ipad的初心是为了当时考研,为了刷网课用,现在考完后,iPad闲置就用来追剧了,平时手机就能满足所有需求了,不是万不得已也不会去买个iPad。iPad价格都能抵一部手机了,当时在
为什么现在很多人会买合约机?感谢您的阅读!为什么现在很多人还是会购买合约机?前一段时间我购买了一款,红米的note10。它就是电信的合约机。你需要每个月交多少话费,并且还会对你的支付宝的花呗进行一定的冻结,在
京东上面慧采的区分是什么?慧采分为三种模式自营慧采FBP慧采IBS慧采自营慧采无需入仓(厂直),产品可在京东慧采企业购等板块展示,打自营的标签(保证金10万15万不等毛保515)具体与采销谈,看综合实力与销
今年辽宁将成建制引进100个创新创业团队今年,围绕做好结构调整三篇大文章,建设数字辽宁智造强省,加快打造具有国际影响力的先进装备制造业基地世界级石化和精细化工产业基地世界级冶金新材料产业基地,辽宁省科技厅以建设具有全国影
中兴不再低调,20G1TB新机陆续备货,5200mAh电池开始起飞对于中兴来说,现在最重要的就是在手机市场上打造爆款产品,因为我们看到,尽管如今的中兴同样有很多旗舰诞生,但在销量人气上完全不行,因此为了引起用户普遍注意,最好的方法就是要打造爆款。
我感觉自己已经崩溃,现在的自己特无助,有多少人被网络骗钱的?我也是被骗后一直在崩溃,2020年12月10日被骗,我一个打工的要打工六七年才有那么多钱,都是借的,刷的信用卡,当时被骗,死的心都有,头发也白了好多,几天都没有睡觉,吃饭,整个人生