首页 > 其他分享 >浅谈spring-retry

浅谈spring-retry

时间:2024-01-09 18:38:02浏览次数:26  
标签:retry 浅谈 spring 重试 异常 Recover 注解 Retryable 方法


使用方法

@Component
public class RetryableXX {

	// 使用重试框架须知:
	// 该注解无事务性!!!!
	// 该注解是同步操作,重试次数与时间间隔需要慎重考虑!!!!
	// 使用重试注解时,务必匹配@Recover回调方法,否则重试次数会平方!!!!
	// 被调用的重试方法必须是被代理过的,否则重试效果不生效!!!!
	// 匹配了@Recover回调方法,只要重试方法中出现了异常,都会执行重试操作!!!![比如:逻辑中出现空指针异常,但是抓取的异常为索引越界异常,重试机制仍然会触发!!!!]
	/*
		value: 捕获指定异常,进行重试操作(一个类中,最好不要出现相同的异常类型,分析结果在后面)
		maxAttempts: 最大重试次数(包含首次执行次数)
		delay: 下次重试与上次执行时间间隔(单位:毫秒)
		multiplier: 用于计算下次重试延迟的乘法器(默认0=忽略)
		ex:
		maxAttempts = 5, multiplier = 1, delay = 5000L, 触发最大重试次数,
		每次执行间隔为 5秒(第一次重试)-->25秒(第二次重试)-->30秒(第三次重试)-->30秒(第四次重试)  
		**奇怪的地方(未深究):超过3次执行后,后面的时间就不是*5了,而是+5)
		注意事项:
		1.最好一个类中只有一个重试方法。
		2.当一个类中出现多个重试方法,需要注意以下2点:
		2.1 重试方法A调用重试方法B,重试方法B的重试规则不生效!但是重试方法B的回调会生效!!!!
		2.2 重试方法A调用重试方法B(this.B()),方法B出现的异常,会被重试方法A捕获到(前提:B方法出现的异常,属于A方法捕获的异常之内)
	*/
	@Retryable(value = { RuntimeException.class }, maxAttempts = 5, backoff = @Backoff(delay = 5000L, multiplier = 0))
	public void execute(String params1, String params2) {
		// TODO
		// 操作数据
		// ...
		int i = 1/0;
		// Retryable不会因为异常而回滚数据库操作!!!!
	}

	/*
		与@Retryable注解方法一一对应
		含义:Retryable进行了最大次数重试,仍未正常执行代码,则触发recover回调。进行最终补偿操作。
		注意事项:
		1.一个类中,最好只存在一个@Recover方法,与@Retryable重试方法保持唯一
		2.recover方法的参数,第一个参数需要与@Retryable注解的value对应(可以拿到错误原因);后续的参数也要与@Retryable方法的参数一致!,如果第一个参数与重试注解的value不一致,系统在触发重试回调时,会报错!!!!
	*/
    @Recover
    public void recover(RuntimeException e, String params1, String params2) {
        System.out.println("TEST func recover"+ e.getMessage());
        System.out.println(params1 + params2);
    }
}

使用重试框架须知: 该注解无事务性!!!! 该注解是同步操作,重试次数与时间间隔需要慎重考虑!!!! 使用重试注解时,务必匹配@Recover回调方法,否则重试次数会平方!!!! 被调用的重试方法必须是被代理过的,否则重试效果不生效!!!! 匹配了@Recover回调方法,只要重试方法中出现了异常,都会执行重试操作!!!![比如:逻辑中出现空指针异常,但是抓取的异常为索引越界异常,重试机制仍然会触发!!!!] 重试注解:@Retryable(value = { RuntimeException.class }, maxAttempts = 5, backoff = @Backoff(multiplier = 0, delay = 5000L))

value: 捕获指定异常,进行重试操作(一个类中,最好不要出现相同的异常类型,分析结果在后面) maxAttempts: 最大重试次数(包含首次执行次数) delay: 下次重试与上次执行时间间隔(单位:毫秒) multiplier: 用于计算下次重试延迟的乘法器(默认0=忽略) ex: maxAttempts =5,multiplier=1, delay = 5000L,触发最大重试次数, 每次执行间隔为 5秒(第一次重试)-->25秒(第二次重试)-->30秒(第三次重试)-->30秒(第四次重试)
**奇怪的地方(未深究):超过3次执行后,后面的时间就不是*5了,而是+5) 注意事项: 1.最好一个类中只有一个重试方法。 2.当一个类中出现多个重试方法,需要注意以下2点: 2.1 重试方法A调用重试方法B,重试方法B的重试规则不生效!但是重试方法B的回调会生效!!!! 2.2 重试方法A调用重试方法B(this.B()),方法B出现的异常,会被重试方法A捕获到(前提:B方法出现的异常,属于A方法捕获的异常之内) 重试失败回调:@Recover 与@Retryable注解方法一一对应 含义:Retryable进行了最大次数重试,仍未正常执行代码,则触发recover回调。进行最终补偿操作。 注意事项: 1.一个类中,最好只存在一个@Recover方法,与@Retryable重试方法保持唯一 2.recover方法的参数,第一个参数需要与@Retryable注解的value对应(可以拿到错误原因);后续的参数也要与@Retryable方法的参数一致!,如果第一个参数与重试注解的value不一致,系统在触发重试回调时,会报错!!!!

标签:retry,浅谈,spring,重试,异常,Recover,注解,Retryable,方法
From: https://blog.51cto.com/u_16358052/9163959

相关文章

  • SpringBoot集成WebSocket实现消息推送
    一、前言WebSocket是一种新型的通信协议,它可以在客户端和服务端之间实现双向通信,具有低延迟、高效性等特点,适用于实时通信场景。它是一种基于TCP协议实现的全双工通信协议,使用它可以实现实时通信,不必担心HTTP协议的短连接问题。SpringBoot可以很方便的集成WebSocket实现高效实时的......
  • #星计划# 在OpenHarmony上使用网络组件axios与Spring Boot进行前后端交互
    在OpenHarmony上使用网络组件axios与SpringBoot进行前后端交互#jitoa#此博客由金陵科技学院-开放原子开源社李俊杰编写仓库地址:axiosTest·AtomGit_开放原子开源基金会代码托管平台结果演示:在OpenHarmony上使用网络组件axios与SpringBoot进行前后端交互_哔哩哔哩_bilib......
  • springboot通过自定义注解@Log实现日志打印
    springboot通过自定义注解@Log实现日志打印效果图实操步骤注意,本代码在springboot环境下运行,jdk1.81.引入依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency>......
  • spring boot自动装配原理
    学习笔记1@SpringBootConfiguration:该注解上有一个@Configuration注解,表示这个springboot启动类是一个配置类,最终要被注入到spring容器中。   2@EnableAutoConfiguration:表示开启自动配置   3@AutoConfigurationPackage,该注解上有一个@Import(AutoConfigurationPacka......
  • 【Spring技术专题】「实战开发系列」保姆级教你SpringBoot整合Mybatis框架实现多数据
    Mybatis是什么Mybatis是一个基于JDBC实现的,支持普通SQL查询、存储过程和高级映射的优秀持久层框架,去掉了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。Mybatis主要思想是将程序中大量的SQL语句剥离出来,配置在配置文件中,以实现SQL的灵活配置。在所有ORM框......
  • Spring MVC 源码分析 - LocaleResolver 组件
    LocaleResolver组件LocaleResolver 组件,本地化(国际化)解析器,提供国际化支持回顾先来回顾一下在 DispatcherServlet 中处理请求的过程中哪里使用到 LocaleResolver 组件,可以回到《一个请求的旅行过程》中的 DispatcherServlet 的 processDispatchResult 方法中看看,如下:priv......
  • 基于SpringBoot+Vue的航班订票管理系统设计实现(源码+lw+部署文档+讲解等)
    (文章目录)前言:heartpulse:博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌:heartpulse:......
  • Java+springboot开发医院智能导诊小程序源码
    智慧医院如何实现智能导诊服务?1、数据收集和整合:医院需要收集和整合患者的医疗数据,包括病历、化验结果、影像资料等。同时,还可以整合相关的医学数据库和知识库,以便为导诊提供支持。2、患者信息采集:在患者来院时,可以通过智能问诊系统收集患者的基本信息、症状描述、病史等。这可以......
  • Spring Boot中使用JPA进行数据库操作
    在Java后端开发中,数据库操作是一个非常重要的环节。SpringBoot作为当前非常流行的轻量级Java开发框架,提供了很多便捷的工具和功能,使得数据库操作变得更加简单快捷。在SpringBoot中,我们可以使用JPA(JavaPersistenceAPI)来进行数据库操作。JPA是一种将对象持久化到数据库的方法,它遵......
  • ERROR tls.obtain will retry {"error": "[ttshhb.org] Obtain: [ttshhb.
    这个错误提示表明Caddy在尝试自动获取TLS证书(通常通过Let'sEncrypt)时遇到了问题,具体是域名ttshhb.org的授权验证失败,并返回了HTTP0状态码。HTTP0状态码通常是网络连接问题或服务器端未响应的情况。在Let'sEncrypt的ACME协议中,获取证书需要进行DNS验证或HTTP/HTTPS验证,如果在执......