文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

怎么进行Spring-Retry的使用

2023-06-25 15:04

关注

怎么进行Spring-Retry的使用,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

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 添加被调用类

@Slf4jpublic 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 添加测试类

@Slf4jpublic 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@Slf4jpublic 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@EnableRetrypublic class DemoApplication {    public static void main(String[] args) {        SpringApplication.run(DemoApplication.class, args);    }}

4 添加测试类

@RunWith(SpringRunner.class)@SpringBootTest(classes = DemoApplication.class)@Slf4jpublic 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)@Documentedpublic @interface EnableRetry {  boolean proxyTargetClass() default false;}

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

@Target({ ElementType.METHOD, ElementType.TYPE })@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @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注解

@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Import(RetryConfiguration.class)@Documentedpublic @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)@Documentedpublic @interface Recover {}

关于怎么进行Spring-Retry的使用问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网行业资讯频道了解更多相关知识。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯