重试框架 -- Guava Retry

一般在各种业务场景中,为了保持系统稳定,我们都会有相应的重试机制,因为比如说,某个接口某个数据库链接由于网络抖动或者其他因素导致响应失败,这时候直接判定失败或者Mock数据未必是一种优雅的方式,因为这种情况下未必是接口挂掉了或者数据库连不上了,有可能是网络一时的抖动导致的,所以这时候一个优雅的重试机制或许能帮上我们。

Guava Retry

Guava Retry模块提供了一种通用方法, 可以使用Guava谓词匹配增强的特定停止、重试和异常处理功能来重试任意Java代码。

源码地址如下:

代码语言:javascript

代码运行次数:0

运行

AI代码解释

复制代码
https://github.com/rholder/guava-retrying
Guava Retry优点

Guava retry工具与spring retry类似,都是通过定义重试者角色来包装正常逻辑重试,但是Guava retry有更优的策略定义,在支持重试次数和重试频度控制基础上,能够兼容支持多个异常或者自定义实体对象的重试源定义,让重试功能有更多的灵活性。

Guava Retryer也是线程安全的,入口调用逻辑采用的是 java.util.concurrent.Callable 的 call() 方法

maven 依赖

代码语言:javascript

代码运行次数:0

运行

AI代码解释

复制代码
<!-- https://mvnrepository.com/artifact/com.github.rholder/guava-retrying -->
<dependency>
    <groupId>com.github.rholder</groupId>
    <artifactId>guava-retrying</artifactId>
    <version>2.0.0</version>
</dependency>
Guava retry Demo

代码语言:javascript

代码运行次数:0

运行

AI代码解释

复制代码
@Slf4j
public class GuavaRetryDemo {
    public static void main(String[] args) {
        //定义请求实现
        Callable<Boolean> callable = () -> {
            // do something useful here
            log.info("call...");
            throw new RuntimeException();
        };

        //定义重试机制
        Retryer<Boolean> retryer = RetryerBuilder.<Boolean>newBuilder()
                // retryIf 重试条件
                .retryIfResult(Objects::isNull)
                //设置异常重试源
                .retryIfExceptionOfType(IOException.class)
                .retryIfRuntimeException()
                .retryIfResult(res -> res = false)
                //设置等待间隔时间
                .withWaitStrategy(WaitStrategies.fixedWait(3, TimeUnit.SECONDS))
                //设置最大重试次数
                .withStopStrategy(StopStrategies.stopAfterAttempt(3))
                .build();
        try {
            retryer.call(callable);
        } catch (RetryException | ExecutionException e) {
            e.printStackTrace();
        }

    }
}

执行结果如下。

代码语言:javascript

代码运行次数:0

运行

AI代码解释

复制代码
22:14:16.027 [main] INFO com.example.retry.demo.retry.guava.GuavaRetryDemo - call...
22:14:19.030 [main] INFO com.example.retry.demo.retry.guava.GuavaRetryDemo - call...
22:14:22.031 [main] INFO com.example.retry.demo.retry.guava.GuavaRetryDemo - call...
com.github.rholder.retry.RetryException: Retrying failed to complete successfully after 3 attempts.
    at com.github.rholder.retry.Retryer.call(Retryer.java:174)
    at com.example.retry.demo.retry.guava.GuavaRetryDemo.main(GuavaRetryDemo.java:42)
Caused by: java.lang.RuntimeException
    at com.example.retry.demo.retry.guava.GuavaRetryDemo.lambda$main$0(GuavaRetryDemo.java:25)
    at com.github.rholder.retry.AttemptTimeLimiters$NoAttemptTimeLimit.call(AttemptTimeLimiters.java:78)
    at com.github.rholder.retry.Retryer.call(Retryer.java:160)
    ... 1 more
永远重试

创建一个可以永远重试的 Retryer,在每次失败的重试之后,以递增指数的间隔等待直到最多5分钟。5分钟后,每隔5分钟重试一次。

代码语言:javascript

代码运行次数:0

运行

AI代码解释

复制代码
Retryer<Boolean> retryer = RetryerBuilder.<Boolean>newBuilder()
        .retryIfExceptionOfType(IOException.class)
        .retryIfRuntimeException()
        .withWaitStrategy(WaitStrategies.exponentialWait(100, 5, TimeUnit.MINUTES))
        .withStopStrategy(StopStrategies.neverStop())
        .build();

创建一个可以永远重试的 Retryer,在每次失败的重试之后,增加斐波那契回退间隔,直到最多2分钟。2分钟后,每隔2分钟重试一次。

代码语言:javascript

代码运行次数:0

运行

AI代码解释

复制代码
Retryer<Boolean> retryer = RetryerBuilder.<Boolean>newBuilder()
        .retryIfExceptionOfType(IOException.class)
        .retryIfRuntimeException()
        .withWaitStrategy(WaitStrategies.fibonacciWait(100, 2, TimeUnit.MINUTES))
        .withStopStrategy(StopStrategies.neverStop())
        .build();
相关推荐
Crazy________1 小时前
13MySQL主从复制原理与搭建指南
数据库·mysql
June`2 小时前
Redis核心应用:从单机到分布式架构解析
数据库·redis·缓存
学习编程的Kitty2 小时前
MySQL——数据库基础与库的操作
数据库·mysql
krielwus2 小时前
Oracle 11g R2 物理冷备操作文档
数据库·oracle
大气层煮月亮2 小时前
Oracle EBS ERP之报表开发—嵌入Web中的报表预览、报表打印
前端·数据库·oracle
会挠头但不秃2 小时前
Redis数据结构和常用命令
数据库·redis·缓存
楠目2 小时前
SQL注入与防御:从攻击原理到预编译防御
数据库·sql
无名前端小白2 小时前
Oracle 转 PostgreSQL, ora2pg docker compose 简单实践版
数据库·postgresql·oracle
庸人自扰614 小时前
Redis从零讲解
数据库·redis·缓存
lypzcgf5 小时前
Coze源码分析-资源库-删除数据库-后端源码-领域服务/数据访问层
数据库·go·coze·coze源码分析·智能体平台·ai应用平台·agent平台