Skip to content

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;
    }
}

贡献者

页面历史

Released under the MIT License.