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