guava-retrying 源码解析(时间限制策略)
Posted shenqidu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了guava-retrying 源码解析(时间限制策略)相关的知识,希望对你有一定的参考价值。
一、时间限制策略相关接口和类
什么是时间限制策略呢?是指在一个时间限制内,包装任何一种重试(尝试)规则,如果超过该限制,那么这个尝试规则可能会被中断,并抛出UncheckedTimeoutException异常。
重试策略接口 AttemptTimeLimiter<V> ,它只有一个方法:
1 /** 2 * callable 受时间限制 3 */ 4 V call(Callable<V> callable) throws Exception;
重试策略工厂类:AttemptTimeLimiters。
重试策略工厂类是一个普通类,意味着你可以在自己的项目中根据自己的需要进行定制化。在工厂类里定义了两种时间限制策略类。
二、详解两种时间限制策略类
1、NoAttemptTimeLimit : 对代理方法不添加时间限制。
对任何一种尝试策略来讲,都没有时间限制,可以一直尝试下去。
// 接口的方法实现 @Override public V call(Callable<V> callable) throws Exception { return callable.call(); }
2、FixedAttemptTimeLimit<V> :对代理方法的尝试添加固定时间限制。
这个策略有两个构造方法,如下,该策略可以传入自定义的ExecutorService。其中SimpleTimeLimiter是guava封装的一个类,用于对回调方法施加时间限制。
因此接口的方法实现就调用了SimpleTimeLimiter对象的callWithTimeout方法。
// 重点看一下最后一个参数:是否通过中止操作和引发InterruptedException来响应线程中断; // 如果为false,则允许操作完成或超时,并重新清除当前线程的中断状态; // 如果为true,并且我们的线程在执行期间被中断,则抛出InterruptedException异常 @Override public V call(Callable<V> callable) throws Exception { return timeLimiter.callWithTimeout(callable, duration, timeUnit, true); }
以上是关于guava-retrying 源码解析(时间限制策略)的主要内容,如果未能解决你的问题,请参考以下文章