SpringBoot进阶教程(八十四)spring-retry

在日常的一些场景中, 很多需要进行重试的操作.而spring-retry是spring提供的一个基于spring的重试框架,某些场景需要对一些异常情况下的方法进行重试就会用到spring-retry。spring-retry可以帮助我们以标准方式处理任何特定操作的重试。在spring-retry中,所有配置都是基于简单注释的。

v添加引用

        <dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>

v启用@Retryable

@SpringBootApplication
@EnableRetry
public class TestApplication {public static void main(String[] args) {SpringApplication.run(TestApplication.class, args);}}

要使用@EnabelRetry开启重试才行,声明在配置类或者启动类上都可以激活。

v在方法上添加@Retryable

创建service接口
public interface HomeService {int convertStatus(int status) throws Exception;
}
在service实现类并添加@Retryable
@Slf4j
@Service
public class HomeServiceImpl implements HomeService {/*** value:抛出指定异常才会重试* include:和value一样,默认为空,当exclude也为空时,默认所有异常* exclude:指定不处理的异常* maxAttempts:最大重试次数,默认3次(包括第一次调用)* backoff:重试等待策略,* 默认使用@Backoff,@Backoff的value默认为1000L,我们设置为2000; 以毫秒为单位的延迟(默认 1000);delay:重试的间隔时间,就是value* multiplier delay时间的间隔倍数,默认为0,表示固定暂停1秒后进行重试,如果把multiplier设置为1.5,则第一次重试为2秒,第二次为3秒,第三次为4.5秒。* @param status* @return* @throws Exception*/@Override@Retryable(retryFor = Exception.class,maxAttempts = 3,backoff = @Backoff(delay = 2000,multiplier = 1.5))public int convertStatus(int status) throws Exception{System.out.println("进入convertStatus时间:"+ LocalTime.now());if (status < 0){throw new Exception("状态小于0是非法的");}System.out.println("convertStatus: status++");return status++;}/*** Spring-Retry还提供了@Recover注解,用于@Retryable重试失败后处理方法。* 如果不需要回调方法,可以直接不写回调方法,那么实现的效果是,重试次数完了后,如果还是没成功没符合业务判断,就抛出异常。* @Recover标记方法必须要与@Retryable注解的方法“形参”保持一致,第一入参为要重试的异常(一定要是@Retryable方法里抛出的异常或者异常父类),其他参数与@Retryable保持一致,返回值也要一样,否则无法执行!** @param e* @param status @Retryable注解的原方法参数,可以保留,也可以不要。* @return*/@Recoverpublic int recover(Exception e, int status) {//记日志到数据库 或者调用其余的方法System.out.println(String.format("兜底方法执行,异常信息:%s,status:%d", e.toString(), status));return -1;}
}

@Retryable修饰的convertStatus()方法,如果调用期间报了异常,那么它将进行重试3次(默认三次),如果超过最大重试次数,则执行@Retryable修饰的recover()方法,

创建controller
@Slf4j
@RestController
public class HomeController {@AutowiredHomeService homeService;@GetMapping("convertStatus")public ReturnValue<?> convertStatus(@RequestParam("token") String token,@RequestParam("status") int status) throws Exception {int result = homeService.convertStatus(status);return ReturnValue.buildSuccessResult(result);}
}
验证效果

SpringBoot进阶教程(八十四)spring-retry

v常用注解介绍

@EnableRetry

启用重试,开启aop的功能,默认使用jdk的动态代理。proxyTargetClass属性为true时(默认false),使用CGLIB代理

@Retryable

标记当前方法会使用重试机制。

属性 类型 默认值 说明
interceptor String “” 将interceptor的bean名称应用到retryable(),和其他的属性互斥
include Class[] {} 哪些异常可以触发重试 ,默认为空
exclude Class[] {} 哪些异常将不会触发重试,默认为空,如果和include属性同时为空,则所有的异常都将会触发重试
value Class[] {} 可重试的异常类型
label String “” 统计报告的唯—标签。如果没有提供,调用者可以选择忽略它,或者提供默认值
maxAttempts int 3 尝试的最大次数(包括第一次失败),默认为3次
backoff @Backoff @Backoff() @Backoff @Backoff()指定用于重试此操作的backoff属性。默认为
@Backoff

重试回退策略(立即重试还是等待一会再重试)

属性 类型 默认值 说明
delay long 0 如果不设置则默认使用1000 ms等待重试,和value同义词
maxDelay long 0 最大重试等待时间
multiplier long 0 用于计算下一个延迟延迟的乘数(大于0生效)
random boolean FALSE 随机重试等待时间

@Backoff 的参数会影响我们使用哪种退避策略

  • FixedBackOffPolicy
    默认退避策略,每 1 秒重试 1 次
  • ExponentialBackOffPolicy
    指数退避策略,当设置 multiplier 时使用,每次重试时间间隔为 当前延迟时间 * multiplier。
  • ExponentialRandomBackOffPolicy
    指数随机退避策略。在指数退避策略的基础上增加了随机性。具体策略查看 getSleepAndIncrement() 方法
  • UniformRandomBackOffPolicy
    均匀随机策略,设置 maxDely 但没有设置 multiplier 时使用,重试间隔会在 maxDelay 和 delay 间随机
@Recover

作为恢复处理程序的方法调用的注释。重试方法最终会调用标注了@Recover 的方法。

@Recover声明的方法和@Retryable 方法相同类型的返回值,Throwable 第一个参数是可选的(但是,如果没有其他参数匹配,则不带该参数的方法将被调用)。从失败方法的参数列表中依次填充后续参数。

v注意事项

  • 使用了Spring-Retry是通过捕获异常的方式来触发重试的,@Retryable注解的方法直接实例化调用不会触发重试,要先将实现类实例化到Spring容器中,然后通过注入等方式使用
  • Spring-Retry是通过捕获异常的方式来触发重试的,@Retryable标注方法产生的异常不能使用try-catch捕获,要在方法上抛出异常,不然不会触发重试
  • recover方法的返回值必须与Spring-Retry是通过捕获异常的方式来触发重试的,@Retryable方法一致
  • 查询可以进行重试,写操作要慎重,除非业务方支持重入

v源码地址

https://github.com/toutouge/javademosecond/tree/master/hellolearn


作  者:请叫我头头哥
出  处:http://www.cnblogs.com/toutou/
关于作者:专注于基础平台的项目开发。如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/864556.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

制造业知识中台:推动智能制造转型升级的智慧大脑

在当今全球制造业的激烈竞争中,智能制造已成为推动产业升级、提升竞争力的关键路径。制造业知识中台,作为连接数据、知识与业务的智慧中枢,正逐步展现出其在推动智能制造转型升级中的巨大潜力。它不仅能够帮助企业实现知识的有效整合与高效利用,还能通过智能化分析与应用,…

电子配件行业的未来之路:产品说明书数字化转型的力量

在科技飞速发展的今天,电子配件行业作为科技创新的前沿阵地,正经历着前所未有的变革。从智能手机、平板电脑到智能穿戴设备,各种新型电子配件层出不穷,极大地丰富了人们的生活。然而,随着产品种类的增多和功能的复杂化,如何确保消费者能够快速、准确地理解和使用这些产品…

基于四象限比例积分控制器的直流电机控制系统simulink建模与仿真

1.课题概述 基于四象限比例积分控制器的直流电机控制系统simulink建模与仿真。2.系统仿真结果 3.核心程序与模型 版本:MATLAB2022a4.系统原理简介直流电机由于其较好的调速性能和较高的控制精度,被广泛应用于各种工业控制场合。为了实现对直流电机转速和位置的精确控制,控制…

人工智能驱动的内部知识库:智能搜索、推荐与知识发现

随着人工智能技术的飞速发展,企业内部知识库的管理与应用方式正经历着前所未有的变革。智能搜索、个性化推荐与深度知识发现,这些曾经只存在于科幻小说中的场景,如今已借助AI技术,在企业的日常运营中成为现实。在这一变革浪潮中,HelpLook作为一款集成了先进AI算法的工具,…

视野修炼-技术周刊第116期 | NB Ping

① NB Ping - 多地址并发 Ping 工具 ② 动画图标 ③ RSS.Beauty - RSS 订阅源美化展示 ④ Console.trace:JavaScript调试的利器 ⑤ 关于跨端的前世今生 ⑥ LogoShip - 图标生成器欢迎来到第 116 期的【视野修炼 - 技术周刊】,下面是本期的精选内容简介 🔧开源工具&技术…

深度学习CUDA环境安装教程---动手学深度学习

首先说明我安装的是《动手学深度学习》中的环境 本人是小白,一次安装,可能有不对的地方,望包含。安装CUDA 因为我们是深度学习,很多时候要用到gpu进行训练,所以我们需要一种方式加快训练速度。 通俗地说,CUDA是一种协助“CPU任务分发+GPU并行处理”的编程模型/平台,用于…

基于龙格库塔算法的锅炉单相受热管建模与matlab数值仿真

1.程序功能描述 基于龙格库塔算法的锅炉单相受热管建模与matlab数值仿真.于过热气温控制系统过于复杂,涉及多个过热器及减温过程,在本次设计中将模型简化成喷水减温器和末级过热器的组合,对喷水减温器部分和蒸汽受热管部分进行数学建模,在建模过程中按均匀传热考虑,…

2024-2025-1 20241408陈烨南《计算机基础与程序设计》第十四周学习总结

这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK14这个作业的目标 无作业正文 本博客链接教材学习内容总结 无 教材学习中的问题和解决过程 Q:如何倒序输出字符串? A: 基于AI的学习代码调试中…

【Azure Event Hub】Kafka消息发送失败(Timeout Exception)

Azure closes inbound Transmission Control Protocol (TCP) idle > 240,000 ms, which can result in sending on dead connections (shown as expired batches because of send timeout).问题描述 使用Azure Event Hub,客户端通过kafka发送消息到Event Hub中,规律性的遇…

基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真

1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a3.部分核心程序 (完整版代码包含详细中文注释和操作步骤视频)figure plot(Error2,linewidth,2); grid on xlabel(迭代次数); ylabel(遗传算法优化过程); legend(Average fitness);[V,I] = min(J…

vscode ssh连接远程服务器时显示time out

现象:mobaxterm通过ssh能正常连接服务器,而在vscode里ssh连接服务器时则提示连接超时。 解决方法:ssh扩展的settings.json中的"remote.SSH.useLocalServer",改为false!!! 因为自己搜到的答案是改为“true”,我的本来就是显示的“true”,没有去管。 但是兜兜…

Training Deep Neural Networks with 8-bit Floating Point Numbers

目录概主要内容Wang N., Choi J., Brand D., Chen C. and Gopalakrishnan K. Training deep neural networks with 8-bit floating point numbers. NeurIPS, 2018.概 本文提出了一种 8-bit 的训练方式. 主要内容本文想要实现 8-bit 的训练, 作者认为主要挑战是两个向量的点击 (…