Rx java PublishProcessor.offer()如何知道下游已经';你不吃了吗?

Rx java PublishProcessor.offer()如何知道下游已经';你不吃了吗?,rx-java,rx-java2,Rx Java,Rx Java2,我使用PublishProcessor.offer()从上游发射。我读到(*),如果订阅者没有准备好接收下一个事件,它可能返回false,因为PublishProcessor不协调背压。我想知道它是如何工作的PublishProcessor如何知道订阅者尚未准备就绪? 我了解到上游可能知道下游通过反应性拉动处理排放的潜力: someObservable.subscribe(new Subscriber<t>() { @Override public void onSt

我使用PublishProcessor.offer()从上游发射。我读到(*),如果订阅者没有准备好接收下一个事件,它可能返回false,因为PublishProcessor不协调背压。我想知道它是如何工作的PublishProcessor如何知道订阅者尚未准备就绪?

我了解到上游可能知道下游通过反应性拉动处理排放的潜力:

someObservable.subscribe(new Subscriber<t>() {
    @Override
    public void onStart() {
      request(1);
    }

    @Override
    public void onCompleted() {
      // gracefully handle sequence-complete
    }

    @Override
    public void onError(Throwable e) {
      // gracefully handle error
    }

    @Override
    public void onNext(t n) {
      // do something with the emitted item "n"
      // request another item:
      request(1);
    }
});
someObservable.subscribe(新订户(){
@凌驾
public void onStart(){
请求(1);
}
@凌驾
未完成的公共无效(){
//优雅地处理序列完成
}
@凌驾
公共无效申报人(可丢弃的e){
//优雅地处理错误
}
@凌驾
下一个(t n)的公共空间{
//对发出的项“n”执行某些操作
//请求另一项目:
请求(1);
}
});

但我的订阅看起来是这样的:

publishProcessor.subscribe(new Consumer<T>() {
                @Override
                public void accept(T t) throws Exception {
                    // do IO
                }
            }, Log::submitCrash);
publishProcessor.subscribe(新消费者(){
@凌驾
公共无效接受(T)引发异常{
//做木卫一
}
},Log::submitCrash);
是否在内部调用请求(1);accept()完成后,或者它不执行反应性拉取?我试着读代码,但似乎不是这样。此使用者被传递给LambdaSubscriber。并且LambdaSubscriber.onNext()不调用请求(n)

此订阅方法的javadoc:

 public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError) 

公共最终一次性订阅(消费者每个
订户
都会收到一份特殊的
订阅
,该订阅跟踪消费者发出的
请求
金额,如果
PublishProcessor
可以在
订户
上调用
onNext

如果跟踪并检查了该金额,则认为消费者尚未准备就绪

如果您同步使用
PublishProcessor
,并从
onNext
内发出
请求
,则跟踪金额将始终大于零,因此
报价
可以通过

但是,如果您使用异步,例如,通过应用
observeOn
,处理器和您的消费者之间现在有一个有界缓冲区,该缓冲区可能会填满,跟踪的请求量可能最终为零,从而阻止
提供
发出更多信号

无限消费意味着消费者发出
请求(Long.MAX_值)
,这被解释为消费者准备好接收任意数量的物品。
PublishProcessor
本身将在您向另一家
发行商订阅时发出

一般来说,unbounded并不意味着无限缓冲,因为特定消费者可能会在
onNext
的调用线程上同步丢弃、批处理、采样或处理项目,因此不会发生溢出