仅使用onBackpressureLatest()消耗最新项目

时间:2018-01-24 23:14:22

标签: java rx-java2

我有一个定期发出物品的生产者和有时非常慢的消费者。重要的是,消费者只能使用最近的项目。我认为onBackpressureLatest()是解决这个问题的完美解决方案。所以我写了以下测试代码:

PublishProcessor<Integer> source = PublishProcessor.create();
source
        .onBackpressureLatest()
        .observeOn(Schedulers.from(Executors.newCachedThreadPool()))
        .subscribe(i -> {
            System.out.println("Consume: " + i);
            Thread.sleep(100);
        });

for (int i = 0; i < 10; i++) {
    System.out.println("Produce: " + i);
    source.onNext(i);
}

我希望它记录如下:

Produce: 0
...
Produce: 9
Consume: 0
Consume: 9

相反,我得到了

Produce: 0
...
Produce: 9
Consume: 0
Consume: 1
...
Consume: 9

onBackpressureLatest()和onBackpressureDrop()都没有任何效果。只有onBackpressureBuffer(i)会导致异常。

我使用rxjava 2.1.9。有什么想法/我的误解可能是什么?

2 个答案:

答案 0 :(得分:2)

observeOn有一个内部缓冲区(默认128个元素),可以立即轻松获取所有源项,因此onBackpressureLatest总是被完全消耗。

修改

您可以创建的最小缓冲区为1,应该提供所需的模式:

source.onBackpressureLatest()
      .observeOn(Schedulers.from(Executors.newCachedThreadPool()), false, 1)
      .subscribe(v -> { /* ... */ });

(较早的delay + rebatchRequest组合实际上与此相同。)

答案 1 :(得分:0)

我认为以下内容可行,但我不完全确定

 PublishProcessor<Integer> source = PublishProcessor.create();
 source
    .onBackpressureLatest()
    .switchMap(item -> Flowable.just(item)) // <--
    .observeOn(
         Schedulers.from(Executors.newCachedThreadPool()))
    .subscribe(i -> {
        System.out.println("Consume: " + i);
        Thread.sleep(100);
    });