在进行第二个demo之前。先来讲解一下reactive-streams官网中有关Subscription的一些规则。因为在Reactor中Subscription的实现版本特别多,所以这里将基于第一篇reactor博客中的demo进行讲解。demo1。
public interface Subscription {
public void request(long n);
public void cancel();
}
Subscription规则
-
Subscription.request和Subscription.cancel务必仅在其Subscriber上下文中调用。
此规则的目的是确定Subscription表示Subscriber和Publisher之间的唯一关系。Subscriber可以控制何时请求元素(request)以及何时不再需要更多元素。
核对demo1中的源码(后续不再重复说明),Subscription的实现是FluxRange.RangeSubscription。其request(long n)方法是在LambdaSubscriber中被调用的:代码1
@Override public final void onSubscribe(Subscription s) { if (Operators.validate(subscription, s)) { this.subscription = s; if (subscriptionConsumer != null) { try { subscriptionConsumer.accept(s); } catch (Throwable t) { Exceptions.throwIfFatal(t); //这里调用了cancel() s.cancel(); onError(t); } } else { //这里调用了request(long n) s.request(Long.MAX_VALUE); } } }
-
Subscription必须允许Su