Choice 组件
概述
Choice
用于决定是否需要进行下一轮重试。它是一个函数式接口,定义如下:
java
public interface Choice<V, E extends Throwable> {
boolean shouldRetryNext(Attempt<V, E> attempt);
}
其中attempt
是本次重试的上下文,它包含了详细的元数据和执行结果(成功的结果或者异常)。Chance
提供多个Choice
的内置实现:
CompositeChoice
:组合多个Choice
实例,按添加的顺序执行MaxTimesLimitChoice
:通过配置的允许的最大重试次数判断是否可以进入下一轮重试,这是最常用的一个实现ExceptionTypeMapChoice
:通过配置的异常类型映射判断是否可以进入下一轮重试ResultPredicateListChoice
:通过配置的结果条件判断是否可以进入下一轮重试CancelJudgeChoice
:判断当前Attempt
是否被取消,如果处于取消状态则拒绝进入下一轮重试ForeverChoice
:开启永久循环重试NeverChoice
:禁用重试MaxCallingTimeLimitChoice
:当前Attempt
的完成时间距离整个调用的初始化时间如果超过一个时间限制则拒绝进入下一轮重试
Chance
建造者默认会把所有添加到其中的Choice
实例封装到一个CompositeChoice
之中,所有的Choice
实例的shouldRetryNext()
方法都返回true
的时候才会判断为可以进入下一轮重试。Chance
建造者默认会把一个CancelJudgeChoice
实例添加到此CompositeChoice
中作为第一个元素。如果内置的Choice
实现不能满足实际场景的需求,可以通过实现Choice
接口定制所需的Choice
组件。
使用 Choice
java
Chance<String> c1 = Chance.<String, Throwable>newBuilder()
// 最大重试次数为3
.withMaxRetryTimes(3)
// 实际调用出现RuntimeException则进行重试,其他类型的异常不允许重试
.withRetryableExceptions(Collections.singletonMap(RuntimeException.class, Boolean.TRUE))
.build();
// 上面的代码可以写成下面这样,效果是等价的
Chance<String> c2 = Chance.<String, Throwable>newBuilder()
.withChoice(Choice.newMaxTimesLimitChoice(3))
.withChoice(Choice.newExceptionTypeMapChoice(Collections.singletonMap(RuntimeException.class, Boolean.TRUE)))
.build();
// 使用自定义Choice实现
Chance<String> c3 = Chance.<String, Throwable>newBuilder()
.withChoice(new CustomChoice())
.build();
class CustomChoice implements Choice<String, Throwable> {
@Override
public boolean shouldRetryNext(Attempt<String, Throwable> attempt) {
// impl shouldRetryNext method
return false;
}
}