Skip to content

Blocker 组件

概述

Blocker用于阻塞等待,阻塞等待的时间由Wait计算得到。它是一个函数式接口,定义如下:

java
public interface Blocker<V, E extends Throwable> {

    void block(long blockMillis, Attempt<V, E> attempt) throws InterruptedException;
}

其中blockMillis是由Wait计算得到将要阻塞的时间,attempt是本次重试的上下文,它包含了详细的元数据和执行结果(成功的结果或者异常)。Chance提供多个Blocker的内置实现:

  • ThreadSleepBlocker:通过线程休眠实现阻塞等待,这是默认启用的实现,也是最常用的一个实现
  • LockSupportParkBlocker:通过LockSupport提供的parkNanos()方法进行阻塞等待
  • ObjectWaitBlocker:通过Object提供的wait()方法进行阻塞等待

如果内置的Blocker实现不能满足实际场景的需求,可以通过实现Blocker接口定制所需的Blocker组件。

使用 Blocker

java
Chance<String> c1 = Chance.<String, Throwable>newBuilder()
        .withBlocker(Blocker.newThreadSleepBlocker())
        .build();

// 上面的代码可以写成下面这样,效果是等价的,因为默认使用的就是ThreadSleepBlocker
Chance<String> c2 = Chance.<String, Throwable>newBuilder()
        .build();

// 使用自定义Blocker实现
Chance<String> c3 = Chance.<String, Throwable>newBuilder()
        .withBlocker(new CustomBlocker())
        .build();

class CustomBlocker implements Blocker<String, Throwable> {

    @Override
    public void block(long blockMillis, Attempt<String, Throwable> attempt) throws InterruptedException {
        // impl block method
    }
}

贡献者

页面历史

Released under the MIT License.