我有一个定期发出物品的生产者和有时非常慢的消费者。重要的是,消费者只能使用最近的项目。我认为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。有什么想法/我的误解可能是什么?
答案 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);
});