Rx java rxjava2生产者消费者&x27;下游';请求一个';上游';放出一个

Rx java rxjava2生产者消费者&x27;下游';请求一个';上游';放出一个,rx-java,rx-android,rx-java2,Rx Java,Rx Android,Rx Java2,我想使用rxjava2实现简单的生产者-消费者模型,当下游请求一个,而上游发出一个时 我知道flatMap或observeOn具有默认缓冲区大小128,因此我将缓冲区大小设置为1,但它也不起作用 Flowable.defer((Callable<Publisher<Integer>>) () -> Flowable.range(1, 5)) .flatMap((Function<Integer, Publisher<Integer

我想使用rxjava2实现简单的生产者-消费者模型,当下游请求一个,而上游发出一个时

我知道
flatMap
observeOn
具有默认缓冲区大小128,因此我将缓冲区大小设置为1,但它也不起作用

Flowable.defer((Callable<Publisher<Integer>>) () -> Flowable.range(1, 5))
            .flatMap((Function<Integer, Publisher<Integer>>) integer -> {
                //do something with long time.
                System.out.println("flatMap:" + integer);
                return Flowable.just(integer);
            }, false, 1) //=====> 1
            .subscribeOn(Schedulers.io())
            .observeOn(Schedulers.computation(), false, 1) //=====> 2
            .subscribe(new Subscriber<Integer>() {
                @Override
                public void onSubscribe(Subscription s) {
                    //request one
                    s.request(1);
                }

                @Override
                public void onNext(Integer integer) {
                    System.out.println("onNext:" + integer);
                }

                @Override
                public void onError(Throwable t) {

                }

                @Override
                public void onComplete() {

                }
            });
预期输出,因为我只调用了一次
s.request(1)

flatMap:1
onNext:1

您的观察者只请求一个项目,但
observeOn()
也将缓冲一个项目。
flatMap()
操作符本身将订阅连续输入

  • 观察者订阅观察者链,并请求1项
  • observeOn()
    为其缓冲区请求1项
  • range()
  • flatMap()
  • observeOn()
    获取一个项作为其缓冲区,然后请求另一个项
  • flatMap()
    获取下一项2。这将被发出并传递到
    observeOn()
    buffer
  • 调用观察者的
    onNext()
  • flatMap()
    获取下一项,3

  • 如果您需要完美的、锁定的步骤,“请求一”->“处理一”,那么流控制并不是实现这一点的方法。相反,您可能希望引入一个提供反馈循环的可观察对象,以便观察者告诉可观察对象处理下一个循环。

    谢谢您的详细步骤。我还认为
    flowable
    无法做到这一点,所以我将尝试您的“反馈循环”方式。
    flatMap:1
    onNext:1