前言

重试,我承认是冷饭重炒了。 之前写过一些关于重试相关的实践介绍文章:

Spring的Retry《Springboot 整合Retry 实现重试机制》:

https://blog.csdn.net/qq_35387940/article/details/99676114

使用DelayQueue 实现了更加动态灵活的 延迟重试:

《Springboot 指定重发的次数和延迟时间,定时异步执行 重发任务》:https://blog.csdn.net/qq_35387940/article/details/105578433

今天,再给大家带来一个又轻又灵活的重试框架整合 ,就是Guava 的重试Retry 。

正文

先给大家看看这个Guava的Retry的几个核心玩法 :

1. 出现异常时重试 ;

出现指定异常时重试;

出现指定异常,里面的提示语或者code等于指定值时重试等。

2.方法返回值等于指定值时重试 ,(String、Integer、Boolean等等都可以,甚至对象等)

3.等待多少秒重试;

固定等待多少秒重试;

随机范围内等待多少秒重试;

不等待秒数直接重试;

增长式等待秒数重试等

4.到达重试多少次数后停止;

不停止,一直重试;

一定时间内,一直重试,然后再停止;

5.重试监听器,每次重试调用监听器里面的方法(可以多个,按照顺序调用)

下面我们来实战一下,写点代码熟悉一下:

1.pom.xml文件引入相关jar:

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

2.新建一个 RetryUtil.java :

写一个业务方法,举例 :

public Boolean shopping(){}

这个方法我们业务要求,如果购买下单不成功就进行重试 :

核心方法,通过RetryerBuilder建造一个重试器:

Retryer<Boolean> retryer = RetryerBuilder.<Boolean>newBuilder()

这个重试器,可以设置各种各样的触发条件、要求,也就是我们文章开头提到的各种玩法。

贴一个写好的代码例子:

import com.github.rholder.retry.*;
import com.google.common.base.Predicates;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;/*** @Author JCccc* @Description* @Date 2021/10/12 9:26*/
public class RetryUtil {private final Logger log = LoggerFactory.getLogger(this.getClass());public Boolean shopping() throws Exception {//定义重试机制Retryer<Boolean> retryer = RetryerBuilder.<Boolean>newBuilder()//retryIf 重试条件.retryIfException().retryIfRuntimeException().retryIfExceptionOfType(Exception.class).retryIfException(Predicates.equalTo(new Exception())).retryIfResult(Predicates.equalTo(false))//等待策略:每次请求间隔1s//fixedWait 固定X秒后重试//noWait不等时间直接重试//incrementingWait 第一个参数为第一次重试时间,后面会通过设置间隔递增秒数重试//randomWait 随机等待设置范围内的时间重试.withWaitStrategy(WaitStrategies.fixedWait(1, TimeUnit.SECONDS))//停止策略 : 尝试请求6次.withStopStrategy(StopStrategies.stopAfterAttempt(6)).withRetryListener(new MyRetryListener()).withRetryListener(new MyRetryListener2()).build();//定义请求实现Callable<Boolean> callable = new Callable<Boolean>() {int times = 1;@Overridepublic Boolean call() throws Exception {log.info("重试调用={}", times);times++;return placeOrder();}};//利用重试器调用请求return retryer.call(callable);}/*** 下单业务方法 模拟** @return*/public Boolean placeOrder() {int number = new Random().nextInt(11);System.out.println("number:"+number);if (7 < number) {//模拟下单成功log.info("下单成功");return true;}log.info("下单失败");return false;}private static class MyRetryListener implements RetryListener {@Overridepublic <V> void onRetry(Attempt<V> attempt) {System.out.println("回调监听器 一,当前是第:"+attempt.getAttemptNumber()+ "次执行");}}private static class MyRetryListener2 implements RetryListener {@Overridepublic <V> void onRetry(Attempt<V> attempt) {System.out.println("回调监听器 二:记录日志"+attempt.getAttemptNumber());}}public static void main(String[] args) throws Exception {RetryUtil retryUtil = new RetryUtil();Boolean result = retryUtil.shopping();System.out.println(result);}}

其实代码里,注释也已经很明白。我在代码里面模拟了一个简单的下单逻辑,如果下单方法返回的数字大于7,代表下单成功,其他情况都需要重试。

代码简述:

运行一下,看看结果:

可以看到每次重试都会按顺序调用我配置的两个监听器里面的方法;

前面两次下单返回数字都小于7,所以继续触发重试,第三次下单成功结束重试。

接着我们继续探索一下,这里的重试监听器,可以看到我们的接受参数是

Attempt

这玩意,其实里面也记录整个重试过程中各种元素。

获取触发重试的异常的原因:
public Throwable getExceptionCause() throws IllegalStateException; 配合 attempt.hasException()使用 ,如果异常存在,那么就拿出异常原因,这样在监听器里面我们就能扩展一些业务逻辑了。

获取当前重试的次数:

public long getAttemptNumber() ;

同样,如果我们业务逻辑需要,在重试次数打到某一个数进行业务扩展时,这个方法就可以用上了,当然用来记录方法重试次数时也是用得上的。

获取距离第一次重试的延迟:

public long getDelaySinceFirstAttempt();

获取重试返回的结果:

public V getResult() throws IllegalStateException;

那么同样,还有关于重试器里的方法,大家感兴趣也是可以点进源码里面,自己探索一下:

以上这几个策略配置器,支持的方法远不止我代码里面介绍的,其实还有很多,例如间隔设置,使用斐波那契增量计算时间等等。

Springboot 使用 Guava 的重试Retry ,轻便灵活相关推荐

  1. SpringBoot基于guava集成令牌桶算法

    SpringBoot基于guava集成令牌桶算法 一.什么是令牌桶 1.令牌桶 2.功能图 二.Guava 1.简单介绍 2.pom引入 3.限速器 4.浅析重载方法 三.系统应用 1.单个接口应用 ...

  2. tenacity发生异常/失败/错误时重试retry机制,Python

    tenacity发生异常/失败/错误时重试retry机制,Python 安装: pip install tenacity 示例: @retry def non_stop():print("永 ...

  3. python 重试—retry库的使用和自定义超时retry

    python 重试-retry库的使用和自定义超时retry 引言 retry 库 安装 使用 参数说明 自定义retry 引言 当我们写代码自动化测试代码时,由于页面读取.数据刷新等造成的页面元素不 ...

  4. 各种学习资源 文档、手册 (Docker 、springboot 、Guava、git、logback 、Linux 、MQ、vue、Axios)

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1. Docker 中文手册 :https://yeasy.gitbooks.io/docker_p ...

  5. activity中fragment 返回键不退出_优雅地处理加载中(loading),重试(retry)和无数据(empty)等...

    LoadSir是一个高效易用,低碳环保,扩展性良好的加载反馈页管理框架,在加载网络或其他数据时候,根据需求切换状态页面,可添加自定义状态页面,如加载中,加载失败,无数据,网络超时,占位图,登录失效等常 ...

  6. 使用Guava retryer优雅的实现接口重试机制

    转载自: 使用Guava retrying优雅的实现接口重调机制 Guava retrying:基于 guava 的重试组件 实际项目中,为了考虑网络抖动,加锁并发冲突等场景,我们经常需要对异常操作进 ...

  7. Springboot - retry机制简介以及踩过的坑

    像一般遇到这样的访问对端服务失败的情况我们都是怎么做的呢,一般不去主动处理的话,数据默认都丢弃了,对于一些对数据要求比较高的服务就不行了,要不就是去重试,要不就是在失败的时候将数据入库,等后面再人工介 ...

  8. 重试利器之Guava Retrying (一、介绍及简单实现)

    何为Guava Retrying? guava-retrying是基于谷歌的核心类库guava的重试机制实现,可以说是一个重试利器. Guava Retrying的使用场景? 在高并发开发的过程中,调 ...

  9. Spring-retry重试组件

    # 一.简介 Spring-retry 前面我们了解到了,Guava的重试组件,我们可以基于Guava的能力,来封装我们需要的能力来满足我们的业务.今天来分享Spring-Retry重试组件.当然Sp ...

  10. 针对Spring的Spring Retry 我发现了这样一个大家都不知道的技巧!

    外部服务对于调用者来说一般都是不可靠的,尤其是在网络环境比较差的情况下,网络抖动很容易导致请求超时等异常情况,这时候就需要使用失败重试策略重新调用 API 接口来获取.重试策略在服务治理方面也有很广泛 ...

最新文章

  1. R语言伯努利分布(Bernoulli distribution)函数(dbern, pbern, qbern rbern)实战
  2. 静态成员变量不占用类的内存空间
  3. CSS3 Media Queries详细介绍和使用实例
  4. java中各种流的详细使用
  5. 程序员修神之路--简约而不简单的分布式通信基石
  6. arcgis选出点规定范围的面
  7. there are so many javascript library
  8. LeetCode两数相除java
  9. POJ3281:Dining——题解
  10. 【Web】关于Session过期/失效的理解
  11. Prescan(七):prescan中air传感器的配置
  12. 表情识别(一)——使用Dlib、opencv和Python识别面部特征
  13. matlab2016b慢,Matlab 2016a/b中调用GPU速度巨慢的解决办法
  14. 2020.7.16.h5面试题
  15. UltraLAB台式图形工作站(并行计算高效王~高性能计算工作站EX620i介绍)
  16. java小游戏_Java开发小游戏,30分钟教会你
  17. vue中eslint报Disallow self-closing on HTML void elements格式错误时的解决方案
  18. Onenote 同步 PAC加速方式
  19. Python基础--魔法方法()运算符重载)
  20. Easymock十分钟入门

热门文章

  1. 黎曼流形与黎曼几何初步-笔记
  2. linux命令离线手册下载,linux 命令速查手册全集下载
  3. 关闭计算机安全模式,怎么关闭安全模式,bios安全启动模式
  4. 上海电力大学计算机科学与技术学院,栗风永 - 上海电力大学 - 计算机科学与技术学院...
  5. linux 函数式编程,理解函数式编程_Linux编程_Linux公社-Linux系统门户网站
  6. 计算机如何添加打印机图标,如何添加打印机设备到电脑
  7. Tomcat部署及负载均衡_wuli大世界_新浪博客
  8. Java代码解压rar文件
  9. openwrt怎么做ap_openwrt 添加 无线AP
  10. 快速指数(快速幂)/模指数运算代码模板