RxJava2中onBackpressureBuffer的行为是什么

时间:2019-08-16 17:46:49

标签: java kotlin rx-java2 rx-kotlin2

我想要做的是让Flowable带有一个项目的反压缓冲器,以保留从流中产生的最新项目。

我尝试使用Flowable.onBackpressureBuffer(1,()-> {},BackpressureOverflowStrategy.DROP_OLDEST)。但是,它不符合我的预期

  Flowable.range(0, 10_000)
      .onBackpressureBuffer(1, {}, BackpressureOverflowStrategy.DROP_OLDEST)
      .observeOn(Schedulers.computation())
      .subscribe {
        println(it)
        Thread.sleep(5)
      }

我期望的输出是整数序列,不一定是连续的,应该包括最后一项9,999。但是,它只打印前几个连续的数字,例如0、1、2、3、4 ...,但每次都不同,而没有打印最后一个数字9,999。

1 个答案:

答案 0 :(得分:1)

我正在使用以下代码,并且始终始终在最后打印9999。它首先打印连续的数字(直到127),然后再打印9999。在您的情况下,也许主执行线程结束的时间比处理打印号码的线程早得多。为了打印直到9999的所有数字,我尝试将反压缓冲区更改为10000(并且主线程睡眠设置为更高的值),这显然确保了所有数字都被打印,因为缓冲区很大。

public class FlowableTest {

    public static void main(String[] args) throws InterruptedException {
        // TODO Auto-generated method stub

        Flowable.range(0, 10_000).onBackpressureBuffer(1, () -> {
        }, BackpressureOverflowStrategy.DROP_OLDEST).observeOn(Schedulers.computation()).subscribe(it -> {
            System.out.println(it);
            Thread.sleep(5);
        });

        Thread.sleep(50000); // wait the main program sufficient time to let the other threads end

    }