广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Spring-Retry的使用详解
  • 192
分享到

Spring-Retry的使用详解

2024-04-02 19:04:59 192人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录1 spring-Retry的简介2 Spring中的应用1 导入Maven坐标2 添加被调用类3 添加测试类3 SpringBoot中的应用1 导入maven坐标2 添加一个管

1 Spring-Retry的简介

在日常的一些场景中, 很多需要进行重试的操作.而spring-retry是spring提供的一个基于spring的重试框架,非常简单好用.

2 Spring中的应用

1 导入maven坐标


 <dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
    <version>1.2.2.RELEASE</version>
 </dependency>

2 添加被调用类


@Slf4j
public class RetryDemo {

    public static boolean retryMethod(Integer param) {
        int i = new Random().nextInt(param);
        log.info("随机生成的数:{}", i);

        if (1 == i) {
            log.info("为1,返回true.");
            return true;
        } else if (i < 1) {
            log.info("小于1,抛出参数异常.");
            throw new IllegalArgumentException("参数异常");
        } else if (i > 1 && i < 10) {
            log.info("大于1,小于10,抛出参数异常.");
            return false;
        } else {
            //为其他
            log.info("大于10,抛出自定义异常.");
            throw new RemoteAccessException("大于10,抛出自定义异常");
        }
    }
}

3 添加测试类


@Slf4j
public class SpringRetryTest {

    
    private long fixedPeriodTime = 1000L;
    
    private int maxRetryTimes = 3;
    
    private Map<Class<? extends Throwable>, Boolean> exceptionMap = new HashMap<>();


    @Test
    public void test() {

        // 1 添加异常的处理结果 true为需要重试 false为不需要重试
        exceptionMap.put(RemoteAccessException.class, true);

        // 2 构建重试模板实例
        RetryTemplate retryTemplate = new RetryTemplate();

        // 3 设置重试回退操作策略  设置重试间隔时间
        FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy();
        backOffPolicy.setBackOffPeriod(fixedPeriodTime);

        // 4 设置重试策略  设置重试次数 设置异常处理结果
        SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy(maxRetryTimes, exceptionMap);

        //5 重试模板添加重试策略 添加回退操作策略
        retryTemplate.setRetryPolicy(retryPolicy);
        retryTemplate.setBackOffPolicy(backOffPolicy);
    
        // 6 调用方法
        Boolean resp = retryTemplate.execute(
                // RetryCallback 重试回调方法
                retryContext -> {
                    boolean result = RetryDemo.retryMethod(110);
                    log.info("方法返回结果= {}", result);
                    return result;
                },
                // RecoveryCallback 异常回调方法
                retryContext -> {
                    //
                    log.info("超过最大重试次数或者抛出了未定义的异常!!!");
                    return false;
                }
        );

        log.info("接口返回结果 = {}",resp);

    }

}

从代码的书写注解可以看到,RetryTemplate对象是Spring-Retry框架的重试执行者, 由它添加重试策略,回退操作策略等(注释第五步).RetryTemplate执行重试方法(注释第六步),通过execute方法, 传入的参数是重试回调逻辑对象RetryCallback 和执行操作结束的恢复对象RecoveryCallback. 且可以切换添加的异常种类, 得知,只有添加过相应的异常,才会触发重试操作,否则直接调用RecoveryCallback对象方法.

RetryTemplate的部分源码:


 
 @Override
 public final <T, E extends Throwable> T execute(RetryCallback<T, E> retryCallback,
   RecoveryCallback<T> recoveryCallback) throws E {
  return doExecute(retryCallback, recoveryCallback, null);
 }

RetryTemplate添加重试策略源码:


 
 public void setRetryPolicy(RetryPolicy retryPolicy) {
  this.retryPolicy = retryPolicy;
 }

RetryPolicy接口的实现类:

AlwaysRetryPolicy:允许无限重试,直到成功,可能会导致死循环

CircuitBreakerRetryPolicy:有熔断功能的重试策略,需设置3个参数openTimeout、resetTimeout和delegate

CompositeRetryPolicy:组合重试策略,有两种组合方式,乐观组合重试策略是指只要有一个策略允许即可以重试,
悲观组合重试策略是指只要有一个策略不允许即可以重试,但不管哪种组合方式,组合中的每一个策略都会执行

ExceptionClassifierRetryPolicy:设置不同异常的重试策略,类似组合重试策略,区别在于这里只区分不同异常的重试

NeverRetryPolicy:只允许调用RetryCallback一次,不允许重试

SimpleRetryPolicy:固定次数重试策略,默认重试最大次数为3次,RetryTemplate默认使用的策略

TimeoutRetryPolicy:超时时间重试策略,默认超时时间为1秒,在指定的超时时间内允许重试

RetryTemplate添加回退策略源码:


 
 public void setBackOffPolicy(BackOffPolicy backOffPolicy) {
  this.backOffPolicy = backOffPolicy;
 }

BackOffPolicy的实现类:

ExponentialBackOffPolicy:指数退避策略,需设置参数sleeper、initialInterval、maxInterval和multiplier,initialInterval指定初始休眠时间,默认100毫秒,maxInterval指定最大休眠时间,默认30秒,multiplier指定乘数,即下一次休眠时间为当前休眠时间*multiplier

ExponentialRandomBackOffPolicy:随机指数退避策略,引入随机乘数可以实现随机乘数回退

FixedBackOffPolicy:固定时间的退避策略,需设置参数sleeper和backOffPeriod,sleeper指定等待策略,默认是Thread.sleep,即线程休眠,backOffPeriod指定休眠时间,默认1秒

NoBackOffPolicy:无退避算法策略,每次重试时立即重试

UnifORMRandomBackOffPolicy:随机时间退避策略,需设置sleeper、minBackOffPeriod和maxBackOffPeriod,该策略在[minBackOffPeriod,maxBackOffPeriod之间取一个随机休眠时间,minBackOffPeriod默认500毫秒,maxBackOffPeriod默认1500毫秒

3 SpringBoot中的应用

1 导入maven坐标


 <dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
    <version>1.2.2.RELEASE</version>
 </dependency>

 <dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.1</version>
 </dependency>

2 添加一个管理类


@Service
@Slf4j
public class SpringRetryDemo {


    
    // delay=2000L表示延迟2秒 multiplier=2表示两倍 即第一次重试2秒后,第二次重试4秒后,第三次重试8秒后
    @Retryable(value = {RemoteAccessException.class}, maxAttempts = 3, backoff = @Backoff(delay = 2000L, multiplier = 2))
    public boolean call(Integer param) {
        return RetryDemo.retryMethod(param);
    }

    
    @Recover
    public boolean recover(Exception e, Integer param) {
        log.info("请求参数为: ", param);
        log.info("超过最大重试次数或抛出没有指定重试的异常, e = {} ", e.getMessage());
        return false;
    }
}

3 启动类上添加注解@EnableRetry


@SpringBootApplication
@EnableRetry
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}    

4 添加测试类


@RunWith(SpringRunner.class)
@SpringBootTest(classes = DemoApplication.class)
@Slf4j
public class DemoApplicationTests {

    @Autowired
    private SpringRetryDemo springRetryDemo;

    @Test
    public void testRetry() {
        boolean result = springRetryDemo.call(110);
        log.info("方法返回结果为: {}", result);
    }
}


注解说明:
@Enableretry注解,启用重试功能(默认是否基于子类代理,默认是否, 即是基于Java接口代理)


@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@EnableAspectJAutoProxy(proxyTargetClass = false)
@Import(RetryConfiguration.class)
@Documented
public @interface EnableRetry {

 
 boolean proxyTargetClass() default false;

}

@Retryable注解, 标记的方法发生异常时会重试

  • value  指定发生的异常进行重试
  • include  与value一样,默认为空,当exclude同时为空时,所有异常都重试
  • exclude  指定异常不重试,默认为空,当include同时为空,所有异常都重试
  • maxAttemps  重试次数,默认3
  • backoff  重试补充机制  默认是@Backoff()注解

@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Retryable {

 
 String interceptor() default "";

 
 Class<? extends Throwable>[] value() default {};

 
 Class<? extends Throwable>[] include() default {};

 
 Class<? extends Throwable>[] exclude() default {};

 
 String label() default "";

 
 boolean stateful() default false;

 
 int maxAttempts() default 3;

 
 String maxAttemptsExpression() default "";

 
 Backoff backoff() default @Backoff();

 
 String exceptionExpression() default "";
}

@Backoff注解

  • delay  延迟多久后重试
  • multiplier  延迟的倍数

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(RetryConfiguration.class)
@Documented
public @interface Backoff {

 
 long value() default 1000;

 
 long delay() default 0;

 
 long maxDelay() default 0;

 
 double multiplier() default 0;

 
 String delayExpression() default "";

 
 String maxDelayExpression() default "";

 
 String multiplierExpression() default "";

 
 boolean random() default false;

}

@Recover注解

当重试达到规定的次数后,被注解标记的方法将被调用, 可以在此方法中进行日志的记录等操作.(该方法的入参类型,返回值类型需要和重试方法保持一致)


@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Import(RetryConfiguration.class)
@Documented
public @interface Recover {
}

参考资料:
https://blog.csdn.net/zzzgd_666/article/details/84377962

到此这篇关于Spring-Retry的使用详解的文章就介绍到这了,更多相关Spring-Retry 使用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Spring-Retry的使用详解

本文链接: https://www.lsjlt.com/news/157077.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Spring-Retry的使用详解
    目录1 Spring-Retry的简介2 Spring中的应用1 导入maven坐标2 添加被调用类3 添加测试类3 SpringBoot中的应用1 导入maven坐标2 添加一个管...
    99+
    2022-11-12
  • Spring Retry重试框架的使用讲解
    目录命令式声明式(注解方式)1. 用法2. RetryTemplate3. RecoveryCallback4. Listeners5. 声明式重试重试的使用场景比较多,比如调用远程...
    99+
    2022-11-13
    Spring Retry重试 Spring Retry
  • 怎么进行Spring-Retry的使用
    怎么进行Spring-Retry的使用,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1 Spring-Retry的简介在日常的一些场景中, 很多需要进行重试的操作.而spr...
    99+
    2023-06-25
  • Spring框架中一个有用的小组件之Spring Retry组件详解
    1、概述 Spring Retry 是Spring框架中的一个组件, 它提供了自动重新调用失败操作的能力。这在错误可能是暂时发生的(如瞬时网络故障)的情况下很有帮助。 在本文中,我们...
    99+
    2022-11-12
  • Spring Retry重试怎么使用
    本篇内容介绍了“Spring Retry重试怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!spring-retry是什么?...
    99+
    2023-07-04
  • Spring Boot中怎么使用Spring Retry重试框架
    今天小编给大家分享一下Spring Boot中怎么使用Spring Retry重试框架的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获...
    99+
    2023-06-30
  • Spring Boot中怎么使用Spring-Retry重试框架
    这篇文章主要介绍“Spring Boot中怎么使用Spring-Retry重试框架”,在日常操作中,相信很多人在Spring Boot中怎么使用Spring-Retry重试框架问题上存在疑惑,小编查阅了各式资料,整理出简...
    99+
    2023-06-30
  • Spring Retry重试框架如何使用
    这篇“Spring Retry重试框架如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring ...
    99+
    2023-07-04
  • 【SpringBoot】75、SpringBoot中使用spring-retry轻松解决重试
    在日常开发过程中,难免会与第三方接口发生交互,例如:短信发送、远程服务调用、争抢锁等场景,当正常调用发生异常时,例如:网络抖动,这些间歇性的异常在一段时候之后会自行恢复,程序为了更加健壮并且更不容易出...
    99+
    2023-09-29
    spring boot java retry 重试 aop
  • 使用Spring-Retry解决SpringBoot应用程序中的重试问题
    目录1、背景2、引入依赖3、开启spring-retry4、在方法上添加@Retryable5、重试完6、注意事项1、背景 在日常开发过程中,难免会与第三方接口发生交互,例如:远程服...
    99+
    2023-05-16
    Spring-Retry解决重试 SpringBoot重试问题
  • Spring Boot中使用Spring Retry重试框架的操作方法
    目录Spring Retry 在SpringBoot 中的应用Maven依赖注解使用开启Retry功能注解@Retryable注解@Recover注解@CircuitBreakerR...
    99+
    2022-11-13
  • SpringBoot中使用Spring-Retry重试框架的实现
    目录Maven依赖注解使用开启Retry功能注解@Retryable注解@Recover注解@CircuitBreakerRetryTemplateRetryTemplate配置使用...
    99+
    2022-11-13
  • spring retry实现方法请求重试的使用步骤
    目录1 spring-retry是什么?2 使用步骤2.1 引入maven库2.2 在spring启动类上开启重试功能2.3 公共业务代码2.4 传统的重试做法2.5 使用sprin...
    99+
    2022-11-13
  • Spring JDBC的使用详解
    目录JDBC介绍DriverManagerConnectionStatement/PreparedStatementResultSetJDBC访问数据库流程配置数据源使用JDBC操纵...
    99+
    2022-11-12
  • spring retry方法调用失败重试机制示例解析
    目录前言1.导入依赖2.注解的使用3.开启重试补充,手动声明式重试:前言 很多场景会用到重试的机制,比如:rpc服务调用失败重试,文件上传oss失败重试,http接口调用失败重试,支...
    99+
    2022-11-13
  • Spring中ResponseBodyAdvice的使用详解
    目录1 ResponseBodyAdvice的简介2 ResponseBodyAdvice的使用1 准备一个SpringBoot项目环境3 添加一个返回包装类4 添加控制类5 接口测...
    99+
    2022-11-12
  • 详解Spring中的@PropertySource注解使用
    @PropertySource注解是Spring用于加载配置文件,默认支持.properties与.xml两种配置文件。@PropertySource属性如下: name:...
    99+
    2022-11-12
  • 详解Spring中Lookup注解的使用
    我们知道在spring容器中单独的一个抽象类是不能成为一个bean的,那么有没有办法呢?这个时候我们可以使用Lookup注解,我们可以看下spring的扫描bean部分逻辑。我们知道...
    99+
    2022-11-12
  • Spring中WebDataBinder使用详解
    Spring MVC Validator @InitBinder and WebDataBinder;Validator是一个用来我们自定义验证的sping接口,WebDataBinder 绑定你的自定义参数,你直接在你的控制器类中通过@I...
    99+
    2023-05-31
    spring webdatabinder dat
  • Spring Boot 使用Druid详解
    Druid是Java语言中最好的数据库连接池,并且能够提供强大的监控和扩展功能,下面来说明如何在 SpringBoot 中配置使用Druid。步骤: 在pom.xml中加载依赖 在application.properties中加入数据源配置...
    99+
    2023-05-31
    spring boot druid
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作