Java工具篇之Guava-retry重试组件

简介: Guava 是一组来自 Google 的核心 Java 库,其中包括新的集合类型(例如 multimap 和 multiset)、不可变集合、图形库以及用于并发、I/O、散列、缓存、原语、字符串等的实用程序!它广泛用于 Google内部的大多数 Java 项目,也被许多其他公司广泛使用。API 非常的简单,我们可以非常轻松的使用,来封装成我们业务中自己的组件。

一、简介

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>

三、使用

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();

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();
策略 使用方法 说明
固定策略 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();

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();
  • StopAfterDelayStrategy :设定一个最长允许的执行时间;比如设定最长执行10s,无论任务执行次数,只要重试的时候超出了最长时间,则任务终止,并返回重试异常RetryException;
  • NeverStopStrategy :不停止,用于需要一直轮训直到返回期望结果的情况;
  • StopAfterAttemptStrategy :设定最大重试次数,如果超出最大重试次数则停止重试,并返回重试异常;
相关文章
|
1月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
69 9
|
2月前
|
监控 Java 测试技术
Java开发现在比较缺少什么工具?
【10月更文挑战第15天】Java开发现在比较缺少什么工具?
37 1
|
23天前
|
SQL Java 索引
java小工具util系列2:字符串工具
java小工具util系列2:字符串工具
137 83
|
21天前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
38 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
23天前
|
Java 数据库
java小工具util系列1:日期和字符串转换工具
java小工具util系列1:日期和字符串转换工具
53 26
|
24天前
|
Java
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
48 24
|
24天前
|
数据采集 存储 监控
Java爬虫:数据采集的强大工具
在数据驱动的时代,Java爬虫技术凭借其强大的功能和灵活性,成为企业获取市场信息、用户行为及竞争情报的关键工具。本文详细介绍了Java爬虫的工作原理、应用场景、构建方法及其重要性,强调了在合法合规的前提下,如何有效利用Java爬虫技术为企业决策提供支持。
|
2月前
|
存储 消息中间件 安全
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
【10月更文挑战第9天】本文介绍了如何利用JUC组件实现Java服务与硬件通过MQTT的同步通信(RRPC)。通过模拟MQTT通信流程,使用`LinkedBlockingQueue`作为消息队列,详细讲解了消息发送、接收及响应的同步处理机制,包括任务超时处理和内存泄漏的预防措施。文中还提供了具体的类设计和方法实现,帮助理解同步通信的内部工作原理。
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
|
1月前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
44 5
|
1月前
|
Java API Maven
如何使用 Java 字节码工具检查类文件的完整性
本文介绍如何利用Java字节码工具来检测类文件的完整性和有效性,确保类文件未被篡改或损坏,适用于开发和维护阶段的代码质量控制。
78 5
下一篇
DataWorks