Spring Retry 教程

简介: Spring Retry 是 Spring 提供的用于处理方法重试的库,通过 AOP 提供声明式重试机制,不侵入业务逻辑代码。主要步骤包括:添加依赖、启用重试机制、设置重试策略(如异常类型、重试次数、延迟策略等),并可定义重试失败后的回调方法。适用于因瞬时故障导致的操作失败场景。

Spring Retry 是 Spring 提供的一个用于处理方法重试的库,它允许在遇到特定异常时自动重试方法的执行,这在处理可能由于瞬时故障导致失败的操作时真的非常非常有用(对于代码逻辑错误自然是重试多少次都没啥用哈_),由于Spring Retry 是通过面向切面编程(即 AOP)提供了一种声明式的重试机制,所以并不会侵入到业务逻辑代码中(so~推荐!)

好啦~开始我们的保姆级demo示例教程//(其实也是使用 Spring Retry 的通用步骤)

  1. 添加依赖
     在项目的 pom.xml 文件中添加 spring-retry 依赖和 Spring AOP 依赖

xml

  1. 代码解读
  2. 复制代码
 <!-- 版本号请参考Maven中央仓库获取最新版本 -->
<dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
</dependency>
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
</dependency>
 <!-- 非Springboot项目不需要下面这个 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
  1. 启用重试机制
     在 Spring Boot 启动类或配置类上使用 @EnableRetry 注解来启用重试机制

  2. 设置重试策略  在需要重试的方法上添加 @Retryable 注解并配置重试的条件和策略
  • value:异常处理,指定触发重试的异常类型(即哪些异常发生了才重试)

  • maxAttempts:重试次数,重试的最大次数

  • backoff:回退策略,使用 @Backoff 注解定义重试的延迟策略,如固定延迟、指数退避等
  • delay:固定延迟,(注意单位是毫秒哈)重试操作的初始延迟时间为 1000 毫秒(就是1秒)
  • multiplier:延迟时间的乘数,每次重试的间隔时间都要乘上这个数(第一次延迟1秒,像下图multiplier=2,那第二次重试就会延迟1*2=2秒……以此类推)

less

  1. 代码解读
  2. 复制代码
@Retryable(value = RuntimeException.class , maxAttempts = 2 , backoff = @Backoff(delay = 1000 , multiplier = 2))
public void service() {
    Random random = new Random() ;
int i = random.nextInt() ;
if (i == 0) {
        System.out.println("i = " + i + " " + LocalDateTime.now()) ;
throw new RuntimeException("service failed!") ;
}
}
  1. 恢复方法(可选,不是非得有)
     使用 @Recover 注解定义当重试失败后的回调方法,就是重试到最大重试次数后,还是抛了指定的异常会再进行什么处理(比如日志报警啊一类的)

typescript

  1. 代码解读
  2. 复制代码
@Recover
public void recoverAfterRetries(RuntimeException e) {
    System.out.println("重试结束!but还是失败了~~~~" + e.getMessage()) ;
}
  1. 测试

测试代码如下

java

代码解读

复制代码

package com.aqin.mytest.service ;

import org.junit.jupiter.api.Test ;
import org.springframework.beans.factory.annotation.Autowired ;
import org.springframework.boot.test.context.SpringBootTest ;

/**
* @Description
* @CreateTime 2024-08-29 11:55:48
* @Version 1.0.0
* @Auther Esther.li
**/
@SpringBootTest
class RetryServiceTest {
    @Autowired
    private RetryService retryService ;

@Test
    void testService() {
        try {
            retryService.service() ;
} catch (Exception e) {
            // 验证是否抛出了预期的异常
            System.out.println(e.getMessage()) ;
}
    }
}

执行下(可以看到没报任何异常)

因为我们service方法是生成一个随机数,然后等于0抛异常(哈哈忘记指定生成的随机数的位数了,没指定可是默认32bit。。等于0的概率emmm)

我们做下调整:指定下随机数位数为10,当i!=0时抛异常,最大重试次数20

可以看到在第13次的时候随机数等于1,于是结束重试,并且每次的时间间隔都是上一次间隔的两倍


转载来源:https://juejin.cn/post/7411548553997516827

相关文章
|
3月前
|
druid Java 关系型数据库
Spring Boot2 系列教程(二十五)Spring Boot 整合 Jpa 多数据源
Spring Boot2 系列教程(二十五)Spring Boot 整合 Jpa 多数据源
|
29天前
|
Java 数据库连接 Spring
一文讲明 Spring 的使用 【全网超详细教程】
这篇文章是一份全面的Spring框架使用教程,涵盖了从基础的项目搭建、IOC和AOP概念的介绍,到Spring的依赖注入、动态代理、事务处理等高级主题,并通过代码示例和配置文件展示了如何在实际项目中应用Spring框架的各种功能。
一文讲明 Spring 的使用 【全网超详细教程】
|
2月前
|
NoSQL Java 数据库连接
《滚雪球学Spring Boot》教程导航帖(更新于2024.07.16)
📚 《滚雪球学Spring Boot》是由CSDN博主bug菌创作的全面Spring Boot教程。作者是全栈开发专家,在多个技术社区如CSDN、掘金、InfoQ、51CTO等担任博客专家,并拥有超过20万的全网粉丝。该教程分为入门篇和进阶篇,每篇包含详细的教学步骤,涵盖Spring Boot的基础和高级主题。
47 1
《滚雪球学Spring Boot》教程导航帖(更新于2024.07.16)
|
21天前
|
SQL Java 数据库连接
Spring Boot联手MyBatis,打造开发利器:从入门到精通,实战教程带你飞越编程高峰!
【8月更文挑战第29天】Spring Boot与MyBatis分别是Java快速开发和持久层框架的优秀代表。本文通过整合Spring Boot与MyBatis,展示了如何在项目中添加相关依赖、配置数据源及MyBatis,并通过实战示例介绍了实体类、Mapper接口及Controller的创建过程。通过本文,你将学会如何利用这两款工具提高开发效率,实现数据的增删查改等复杂操作,为实际项目开发提供有力支持。
54 0
|
1月前
|
Java 关系型数据库 MySQL
|
3月前
|
存储 NoSQL Java
教程:Spring Boot与RocksDB本地存储的整合方法
教程:Spring Boot与RocksDB本地存储的整合方法
|
3月前
|
NoSQL Java Spring
教程:Spring Boot与ETCD键值存储的整合
教程:Spring Boot与ETCD键值存储的整合
|
2月前
|
Java 索引 Spring
教程:Spring Boot中集成Elasticsearch的步骤
教程:Spring Boot中集成Elasticsearch的步骤
|
2月前
|
Java API Spring
教程:Spring Boot中如何集成GraphQL
教程:Spring Boot中如何集成GraphQL
|
2月前
|
缓存 Java Spring
教程:Spring Boot中集成Memcached的详细步骤
教程:Spring Boot中集成Memcached的详细步骤