Java 仅使用onBackpressureLatest()消费最新商品

Java 仅使用onBackpressureLatest()消费最新商品,java,rx-java2,Java,Rx Java2,我有一个周期性发射物品的生产商和一个有时相当慢的消费者。重要的是,消费者只能使用最近的商品。我认为onBackpressureLatest()是这个问题的完美解决方案。因此,我编写了以下测试代码: PublishProcessor<Integer> source = PublishProcessor.create(); source .onBackpressureLatest() .observeOn(Schedulers.from(Executors

我有一个周期性发射物品的生产商和一个有时相当慢的消费者。重要的是,消费者只能使用最近的商品。我认为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: 1
...
Consume: 9
onBackpressureLatest()和onBackpressureDrop()都没有任何效果。只有onBackpressureBuffer(i)会导致异常


我使用rxjava2.1.9。你知道问题/我的误解是什么吗?

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

编辑:

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

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

(早期的
延迟
+
重新开发任务
组合实际上相当于此)。

我认为以下方法应该有效,但我不完全确定

 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);
    });
PublishProcessor source=PublishProcessor.create();
来源
.onBackpressureLatest()
.switchMap(项目->可流动.just(项目))//{
System.out.println(“消费:+i”);
睡眠(100);
});

我没有得到此代码的任何输出。然而,被接受的解决方案对我来说已经足够好了(尽管我并不觉得它完全令人满意)。有没有一种方法可以让我提供一个与onBackpressureLatest()具有相同功能的
onDrop
方法
+
observeOn(…,1)
 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);
    });