guava-retrying 源码解析(等待策略详解)
一、等待策略相关类:
1、等待策略接口:WaitStrategy接口
该接口只有一个方法,就是返回尝试失败之后,下一次尝试之前的等待时间。
long computeSleepTime(Attempt failedAttempt);
2、创建等待策略对象的工厂类:com.github.rholder.retry.WaitStrategies类,这是一个常量类,负责创建等待策略对象。
在该工厂类的内部实现了七种等待策略,如下:

二、七种等待策略详解如下:
1、等待固定时间的策略:FixedWaitStrategy类 (默认策略,等待时间为0L)
这个类很简单,方法抛出异常后,隔固定时间进行一次重试即可。
// 方法抛出异常后,conputeSleepTime返回固定的时间,单位ms
@Override
public long computeSleepTime(Attempt failedAttempt) {
return sleepTime;
}
2、等待时间自增的策略:IncrementingWaitStrategy类
这个类每次重试的间隔时间随着重试次数的增加而增加,每次增加固定的时间。
// initialSleepTime 默认时间
// increment 自增时间
// getAttemptNumber 第几次重试
@Override
public long computeSleepTime(Attempt failedAttempt) {
long result = initialSleepTime + (increment * (failedAttempt.getAttemptNumber() - 1));
return result >= 0L ? result : 0L;
}
3、等待时间随机的策略:RandomWaitStrategy类
这种策略等待时间在某个范围:
如果传入一个参数,则为 [0L,timeUnit.toMillis(maximumTime)];
如果传入两个个参数,则为 [minimumTimeUnit.toMillis(minimumTime),maximumTimeUnit.toMillis(maximumTime)]

4、等待时间指数形式增长:ExponentialWaitStrategy类
这中策略等待时间呈指数形式增长,指数形式增长,如果指定最大等待时间,则增长到最大等待时间就不再增长;如果没有指定最大等待时间,则最大等待时间为Long.MAX_VALUE
主要逻辑如下:

5、等待时间以斐波拉契数列形式增长:FibonacciWaitStrategy类
有三个工厂方法:
无参:等待时间从 1 增长到 Long.MAX_VALUE
两个参数:等待时间从 1 增长到 maximumTimeUnit.toMillis(maximumTime),到最大值以后等待时间恒定不变
三个参数:等待时间从 multiplier 增长到 maximumTimeUnit.toMillis(maximumTime)
等待时间增长主要实现逻辑:

6、如果抛出的是指定异常,则从传入的函数中取得等待时间:ExceptionWaitStrategy类
如果抛出的是指定异常,则从传入的function中取得等待时间并返回。如果异常不匹配,则返回等待时间为0L。
具体实现逻辑如下:
其中lastAttempt.getExceptionCause() 为抛出的异常;exceptionClass为指定异常。

这里简单解释一下 Class.isAssignableFrom(Class clazz) 方法:该方法用来判断一个类Class1和另一个类Class2是否相同或者 Class1是Class2的父类或接口。
interface DemoInterface { }
class DemoParent { }
public class Demo extends DemoParent implements DemoInterface{
public static void main(String[] args) {
System.out.println(Demo.class.isAssignableFrom(DemoParent.class)); // false
System.out.println(Demo.class.isAssignableFrom(DemoInterface.class)); // false
System.out.println(DemoParent.class.isAssignableFrom(Demo.class)); // true
System.out.println(DemoInterface.class.isAssignableFrom(Demo.class)); // true
System.out.println(Demo.class.isAssignableFrom(Demo.class)); // true
}
}
7、组合多种等待策略,得到等待时间的方式:CompositeWaitStrategy类
在获取等待时间时会获取多种等待策略各自的等待时间,然后累加这些等待时间并返回。
/**
* 组合等待策略
* @author yjp
*/
@Test
public void testCompositeWaitStrategy() {
WaitStrategy fibonacciWait = WaitStrategies.fibonacciWait(1000L, 50000L, TimeUnit.MILLISECONDS);
WaitStrategy fixedWait = WaitStrategies.fixedWait(1000L, TimeUnit.MILLISECONDS);
WaitStrategy compositeWait = WaitStrategies.join(fibonacciWait, fixedWait);
assertEquals(2000L, compositeWait.computeSleepTime(failedAttempt(1, 1)));
// 第5次斐波拉契增长的等待时间是 5000L, 加上固定的等待时间 1000L
assertEquals(6000L, compositeWait.computeSleepTime(failedAttempt(5, 1)));
}
// --------------源码具体实现----------------
@Override
public long computeSleepTime(Attempt failedAttempt) {
long waitTime = 0L;
for (WaitStrategy waitStrategy : waitStrategies) {
// 各策略根据各自的逻辑获取自己的等待是时间。然后累加到result中
waitTime += waitStrategy.computeSleepTime(failedAttempt);
}
return waitTime;
}
guava-retrying 源码解析(等待策略详解)的更多相关文章
- 【源码解析】BlockManager详解
1 Block管理模块的组件和功能 BlockManager:BlockManager源码解析 Driver和Executor都会创建 Block的put.get和remove等操作的实际执行者 Bl ...
- vuex 源码解析(四) mutation 详解
mutation是更改Vuex的store中的状态的唯一方法,mutation类似于事件注册,每个mutation都可以带两个参数,如下: state ;当前命名空间对应的state payload ...
- 我的书籍《深入解析Java编译器:源码剖析与实例详解》就要出版了
一个十足的技术迷,2013年毕业,做过ERP.游戏.计算广告,在大公司呆过,但终究不满足仅对技术的应用,在2018年末离开了公司,全职写了一本书<深入解析Java编译器:源码剖析与实例详解> ...
- nginx源码分析线程池详解
nginx源码分析线程池详解 一.前言 nginx是采用多进程模型,master和worker之间主要通过pipe管道的方式进行通信,多进程的优势就在于各个进程互不影响.但是经常会有人问道,n ...
- 【集合框架】JDK1.8源码分析之ArrayList详解(一)
[集合框架]JDK1.8源码分析之ArrayList详解(一) 一. 从ArrayList字表面推测 ArrayList类的命名是由Array和List单词组合而成,Array的中文意思是数组,Lis ...
- Spring源码之九finishRefresh详解
Spring源码之九finishRefresh详解 公众号搜索[程序员田同学],专职程序员兼业余写手,生活不止于写代码 Spring IoC 的核心内容要收尾了,本文将对最后一个方法 finishRe ...
- 第二章 Google guava cache源码解析1--构建缓存器
1.guava cache 当下最常用最简单的本地缓存 线程安全的本地缓存 类似于ConcurrentHashMap(或者说成就是一个ConcurrentHashMap,只是在其上多添加了一些功能) ...
- Google guava cache源码解析1--构建缓存器(1)
此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 1.guava cache 当下最常用最简单的本地缓存 线程安全的本地缓存 类似于ConcurrentHas ...
- Guava Cache源码解析
概述: 本次主要是分析cache的源码,基本概念官方简介即可. 基本类图: 在官方的文档说明中,Guava Cache实现了三种加载缓存的方式: LoadingCache在构建缓存的时候,使用buil ...
随机推荐
- vue项目中postcss-pxtorem的使用及webpack中的配置 css中单位px和em,rem的区别
移动手机版要求我们在制作嵌入h5的时候去适配不同的手机.适配有多重模式,有flex.百分比等.字体大小的控制也有px.百分比.rem等单位,webpack中 px转rem. vue项目中postcss ...
- week_one-python基础 列表 增删改查
# Author:larlly #列表增删改查#定义列表name = ["wo","ni","ta","wo"] #定义 ...
- php 排列组合函数(无重复组合,可重复组合【全排列组合】)
<?php /** * 无重复排列組合 * @Author MAX * @DateTime 2018-09-07T16:28:40+0800 * @param Array $arr 需要排列組合 ...
- MyBio小隐本记注册破解
既然开始了,就把这一个系列的都破了算了,这次主角小隐本记MyBio 和WDTP的原理是差不多的,先把软件界面换成e文,然后写了15个记录后提示注册,一样的路子,直接跳过注册窗口的弹出就好了 然后查壳一 ...
- python from entry to abandon2
学习Linux已经有大致两周了,依然感觉到自己仍然在运维的大门外徘徊.于是我想要找到一个在Linux之外的业余方向,可以以作为枯燥基础学习的调节.没过多久我就发现了Python可以说是钦定的选择,它作 ...
- webpack 与 vue 打包体积优化
webpack 与 vue 在使用vue开发时,遇到打包后单个文件太大,因而需要分包,不然加载时间太久.虽然尽可能减少请求次数,但是单个包太大也不是好事 思路 组件按需加载 vue-router 的懒 ...
- 伪分布式安装core-site.xml和hdfs-site.xml配置文件
hadoop的伪分布式安装流程如下所示: 其中core-site.xml和hdfs-site.xml是两个很重要的配置文件. core-site.xml <configuration> & ...
- TCP/IP三次握手和四次挥手
原博链接:https://www.cnblogs.com/Andya/p/7272462.html
- ssm 出现 Method threw 'org.apache.ibatis.binding.BindingException' exception.Invalid bound statement (not found)……
运行数据库的增删改查时出现 500状态码 并且提示 Method threw 'org.apache.ibatis.binding.BindingException' exception.Invali ...
- 深入理解Plasma(二)Plasma 细节
这一系列文章将围绕以太坊的二层扩容框架,介绍其基本运行原理,具体操作细节,安全性讨论以及未来研究方向等.本篇文章主要对 Plasma 一些关键操作的细节进行剖析. 在上一篇文章中我们已经理解了什么是 ...