第04篇:Guava-retry重试组件

举报
西魏陶渊明 发表于 2022/09/25 01:15:05 2022/09/25
【摘要】 作者: 西魏陶渊明 博客: https://blog.springlearn.cn/ 西魏陶渊明 天下代码一大抄, 抄来抄去有提高, 看你会抄不会抄! 一、简介 Guava-re...

作者: 西魏陶渊明
博客: https://blog.springlearn.cn/

西魏陶渊明
天下代码一大抄, 抄来抄去有提高, 看你会抄不会抄!

一、简介

Guava-retry
Guava 是一组来自 Google 的核心 Java 库,其中包括新的集合类型(例如 multimap 和 multiset)、不可变集合、图形库以及用于并发、I/O、散列、缓存、原语、字符串等的实用程序!它广泛用于 Google
内部的大多数 Java 项目,也被许多其他公司广泛使用。

API 非常的简单,我们可以非常轻松的使用,来封装成我们业务中自己的组件。

二、依赖

    <dependency>
        <groupId>com.github.rholder</groupId>
        <artifactId>guava-retrying</artifactId>
        <version>2.0.0</version>
    </dependency>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

三、使用

3.1 指定异常

配置如果发生了 Exception 异常进行重试

    Retryer<User> retry = RetryerBuilder.<User>newBuilder()
                //发生ConnectException异常时重试
                .retryIfExceptionOfType(Exception.class)
                //重试的等待策略 初始等待1s,每次递增1s。如:第一次1s,第二次2s,第三次3s,以此类推...
                .withWaitStrategy(WaitStrategies.incrementingWait(1, TimeUnit.SECONDS, 1, TimeUnit.SECONDS))
                //重试3次后停止
                .withStopStrategy(StopStrategies.stopAfterAttempt(3)).build();

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3.2 重试策略

WaitStrategy 重试策略

    Retryer<User> retry = RetryerBuilder.<User>newBuilder()
                //发生ConnectException异常时重试
                .retryIfExceptionOfType(Exception.class)
                //重试的等待策略 初始等待1s,每次递增1s。如:第一次1s,第二次2s,第三次3s,以此类推...
                .withWaitStrategy(WaitStrategies.incrementingWait(1, TimeUnit.SECONDS, 1, TimeUnit.SECONDS))
                //重试3次后停止
                .withStopStrategy(StopStrategies.stopAfterAttempt(3)).build();

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
策略 使用方法 说明
固定策略 WaitStrategies.fixedWait(10,TimeUnit.SECONDS) 每10秒执行一次
随机策略 WaitStrategies.randomWait(100,TimeUnit.SECONDS) 0 到 100秒之间随机执行一次
随机策略 WaitStrategies.randomWait(10,TimeUnit.SECONDS,20,TimeUnit.SECONDS) 10 到 20秒之间随机执行一次
递增策略 WaitStrategies.incrementingWait(1, TimeUnit.SECONDS, 1, TimeUnit.SECONDS) 初始等待1s,每次递增1s。如:第一次1s,第二次2s,第三次3s,以此类推…
异常策略 WaitStrategies.exceptionWait(…) 不同的异常返回不同的重试时间
斐波那契数列策略 WaitStrategies.fibonacciWait(…) 1、1、2、3、5、8、13、21类推

3.3 重试监听器

Attempt 代表每次执行动作,可以获取执行次数,打印执行日志

 Retryer<User> retry = RetryerBuilder.<User>newBuilder()
                //发生ConnectException异常时重试
                .retryIfExceptionOfType(Exception.class)
                //重试的等待策略 初始等待1s,每次递增1s。如:第一次1s,第二次2s,第三次3s,以此类推...
                .withWaitStrategy(WaitStrategies.incrementingWait(1, TimeUnit.SECONDS, 1, TimeUnit.SECONDS))
                //重试监听器
                .withRetryListener(new RetryListener() {
                    @Override
                    public <V> void onRetry(Attempt<V> attempt) {
                        System.out.println("重试次数:" + attempt.getAttemptNumber());
                        System.out.println("异常:" + attempt.getExceptionCause());
                        System.out.println("返回值:"+attempt.get());
                    }
                })
                //重试3次后停止
                .withStopStrategy(StopStrategies.stopAfterAttempt(10)).build();

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

3.4 停止策略

StopStrategy 一般常用的就是重试多少次

 Retryer<User> retry = RetryerBuilder.<User>newBuilder()
                //发生ConnectException异常时重试
                .retryIfExceptionOfType(Exception.class)
                //重试的等待策略 初始等待1s,每次递增1s。如:第一次1s,第二次2s,第三次3s,以此类推...
                .withWaitStrategy(WaitStrategies.incrementingWait(1, TimeUnit.SECONDS, 1, TimeUnit.SECONDS))
                //重试3次后停止
                .withStopStrategy(StopStrategies.stopAfterAttempt(10)).build();

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • StopAfterDelayStrategy :设定一个最长允许的执行时间;比如设定最长执行10s,无论任务执行次数,只要重试的时候超出了最长时间,则任务终止,并返回重试异常RetryException;
  • NeverStopStrategy :不停止,用于需要一直轮训直到返回期望结果的情况;
  • StopAfterAttemptStrategy :设定最大重试次数,如果超出最大重试次数则停止重试,并返回重试异常;

文章来源: springlearn.blog.csdn.net,作者:西魏陶渊明,版权归原作者所有,如需转载,请联系作者。

原文链接:springlearn.blog.csdn.net/article/details/125895842

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。