通过使用guavaretrying实现灵活的重试机制
概述
本文将介绍 guava-retrying 是什么,有什么用,以及如何在项目中合理运用。 guava-retrying 是一个线程安全的 Java 重试类库,提供了一种通用方法去处理任意需要重试的代码。 可以方便灵活地控制重试次数、重试时机、重试频率、停止时机等,并具有异常处理功能。
主要包括以下内容: guava-retrying 的关键点 guava-retrying 的 maven 依赖 使用场景分析 基本使用 guava-retrying 原理解析 具体的使用场景案例 在 spring boot 中的使用 guava-retrying 的关键点将业务逻辑封装到实现了 Callable 接口的 call 方法中 支持设置当遇到什么异常的时候进行重试操作(也就是重新执行 Callable 接口的 call 方法) 支持设置当 call 方法的返回结果不符合预期的时候进行重试操作 支持设置重试的次数 支持设置每次重试后的等待时间 通过构造器模式创建重试对象 Retryer guava-retrying 的 maven 依赖 com.github.rholder guava-retrying 2.0.0 使用场景分析由于网络问题需要重试 某个任务的执行时间比较长,可以通过重试来不断检查执行结果是否完成 基本使用定义业务逻辑业务逻辑封装在 Callable 对象中。 Callable callable = () -> { return thirdApi.invoke(); // 业务逻辑 }; 定义重试器通过构造器模式创建一个 Retryer 重试器对象 // 定义重试器 Retryer retryer = RetryerBuilder.newBuilder() .retryIfResult(Predicates.isNull()) // 如果结果为空则重试 .retryIfExceptionOfType(IOException.class) // 发生IO异常则重试 .retryIfRuntimeException() // 发生运行时异常则重试 .withWaitStrategy(WaitStrategies.incrementingWait(10, TimeUnit.SECONDS, 10, TimeUnit.SECONDS)) // 每次重试后的等待时间配置:首次10s, 之后每次增加 10s .withStopStrategy(StopStrategies.stopAfterAttempt(4)) // 停止重试配置:允许执行4次(首次执行 + 最多重试3次) .build(); 通过重试器来执行代码通过重试器的 call 方法执行业务逻辑代码 try { retryer.call(callable); // 执行 } catch (final Exception e) { // 重试次数超过阈值或被强制中断 log.error("出现异常", e); } 也可以通过 wrap 方法返回 RetryerCallable 对象,之后再通过 RetryerCallable 对象中的 call 执行业务逻辑 try { final Retryer.RetryerCallable