设为首页 加入收藏

TOP

Java 中的 7 种重试机制,还有谁不会?!(四)
2023-08-26 21:11:23 】 浏览:108
Tags:Java
分不同异常的重试
  • CircuitBreakerRetryPolicy:有熔断功能的重试策略,需设置3个参数openTimeout、resetTimeout和delegate
  • CompositeRetryPolicy:组合重试策略,有两种组合方式,乐观组合重试策略是指只要有一个策略允许即可以重试,悲观组合重试策略是指只要有一个策略不允许即可以重试,但不管哪种组合方式,组合中的每一个策略都会执行
  • 7. guava-retry

    和 Spring Retry 相比,Guava Retry 具有更强的灵活性,并且能够根据 返回值 来判断是否需要重试

    <dependency>
        <groupId>com.github.rholder</groupId>
        <artifactId>guava-retrying</artifactId>
        <version>2.0.0</version>
    </dependency>
    @Override
    public String guavaRetry(Integer num) {
        Retryer<String> retryer = RetryerBuilder.<String>newBuilder()
                //无论出现什么异常,都进行重试
                .retryIfException()
                //返回结果为 error时,进行重试
                .retryIfResult(result -> Objects.equals(result, "error"))
                //重试等待策略:等待 2s 后再进行重试
                .withWaitStrategy(WaitStrategies.fixedWait(2, TimeUnit.SECONDS))
                //重试停止策略:重试达到 3 次
                .withStopStrategy(StopStrategies.stopAfterAttempt(3))
                .withRetryListener(new RetryListener() {
                    @Override
                    public <V> void onRetry(Attempt<V> attempt) {
                        System.out.println("RetryListener: 第" + attempt.getAttemptNumber() + "次调用");
                    }
                })
                .build();
        try {
            retryer.call(() -> testGuavaRetry(num));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "test";
    }
    

    先创建一个Retryer实例,然后使用这个实例对需要重试的方法进行调用,可以通过很多方法来设置重试机制:

    • retryIfException():对所有异常进行重试
    • retryIfRuntimeException():设置对指定异常进行重试
    • retryIfExceptionOfType():对所有 RuntimeException 进行重试
    • retryIfResult():对不符合预期的返回结果进行重试

    还有五个以 withXxx 开头的方法,用来对重试策略/等待策略/阻塞策略/单次任务执行时间限制/自定义监听器进行设置,以实现更加强大的异常处理:

    • withRetryListener():设置重试监听器,用来执行额外的处理工作
    • withWaitStrategy():重试等待策略
    • withStopStrategy():停止重试策略
    • withAttemptTimeLimiter:设置任务单次执行的时间限制,如果超时则抛出异常
    • withBlockStrategy():设置任务阻塞策略,即可以设置当前重试完成,下次重试开始前的这段时间做什么事情

    总结

    从手动重试,到使用 Spring AOP 自己动手实现,再到站在巨人肩上使用特别优秀的开源实现 Spring Retry 和 Google guava-retrying,经过对各种重试实现方式的介绍,可以看到以上几种方式基本上已经满足大部分场景的需要:

    • 如果是基于 Spring 的项目,使用 Spring Retry 的注解方式已经可以解决大部分问题
    • 如果项目没有使用 Spring 相关框架,则适合使用 Google guava-retrying:自成体系,使用起来更加灵活强大

    版权声明:本文为CSDN博主「sco5282」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/sco5282/article/details/131390099

    近期热文推荐:

    1.1,000+ 道 Java面试题及答案整理(2022最新版)

    2.劲爆!Java 协程要来了。。。

    3.Spring Boot 2.x 教程,太全了!

    4.别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!

    5.《Java开发手册(嵩山版)》最新发布,速速下载!

    觉得不错,别忘了随手点赞+转发哦!

    首页 上一页 1 2 3 4 下一页 尾页 4/4/4
    】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
    上一篇SpringBoot入门 下一篇9、Spring之代理模式

    最新文章

    热门文章

    Hot 文章

    Python

    C 语言

    C++基础

    大数据基础

    linux编程基础

    C/C++面试题目