🤗 ApiHug × {Postman|Swagger|Api...} = 快↑ 准√ 省↓
- GitHub - apihug/apihug.com: All abou the Apihug
- apihug.com: 有爱,有温度,有质量,有信任
- ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace
Disposable
subscribe()
调用会返回一个 Disposable
对象, Disposable
代表 当前的 subscription
可以通过调用 dispose()
来取消。
使用多线程模拟生产者生产的很快,然后立马取消订阅(虽然立刻取消但是由于生产者实在太快了,所以订阅者还是接收到了一些元素)。
其他的方法,比如 Disposables.composite()
会得到一个 Disposable
的集合,调用它的 dispose()
方法会把集合里的所有 Disposable
的 dispose()
方法都调用。
当然 Disposable
还有很多其他的功能接口,可以参考官方文档。
#Subscriber
如果我们穿进去是 Lambda
表达式, 创建的是 LambdaSubscriber
Subscriber。
public final Disposable subscribe(
@Nullable Consumer<? super T> consumer,
@Nullable Consumer<? super Throwable> errorConsumer,
@Nullable Runnable completeConsumer,
@Nullable Context initialContext) {
return subscribeWith(new LambdaSubscriber<>(consumer, errorConsumer,
completeConsumer,
null,
initialContext));
}
继承 BaseSubscriber
可以当模板类使用, 只需要实现 hook*
函数来实现回调。
class MySubscriber<T> extends BaseSubscriber<T> {
@Override
protected void hookOnSubscribe(Subscription subscription) {
LOGGER.debug("MY--Subscribed");
request(1);
}
@Override
protected void hookOnNext(T value) {
LOGGER.debug("MY--VALUE: " + value);
request(1);
}
}
@Test
void givenMySubscriber_test() {
Flux.just(1, 2, 3, 4)
.log()
.map(
i -> {
LOGGER.debug("{}:{}", i, Thread.currentThread());
return i * 2;
})
.subscribe(new MySubscriber());
}
然后可以看到输出:
// | onSubscribe([Synchronous Fuseable]
// ReactorIntegrationTest - MY--Subscribed
// | request(1)
// | onNext(1)
// ReactorIntegrationTest - 1
// ReactorIntegrationTest - MY--VALUE: 2
// | request(1)
// | onNext(2)
// ReactorIntegrationTest - 2
// ReactorIntegrationTest - MY--VALUE: 4
// | request(1)
// | onNext(3)
// ReactorIntegrationTest - 3
// ReactorIntegrationTest - MY--VALUE: 6
// | request(1)
// | onNext(4)
// ReactorIntegrationTest - 4
// ReactorIntegrationTest - MY--VALUE: 8
// | request(1)
// | onComplete()
默认 BaseSubscriber
直接 requestUnbounded
:
protected void hookOnSubscribe(Subscription subscription){
subscription.request(Long.MAX_VALUE);
}
public final void requestUnbounded() {
request(Long.MAX_VALUE);
}
#Backpressure
其实从上面