如何在Rxjava2中获取有关背压的实际最新事件? Flowable.onBackpressureLatest()无法正常工作

时间:2018-11-30 15:17:02

标签: rx-java rx-java2 backpressure

当生产者生产事件的速度快于客户消耗的速度时。

我认为将FlowableonBackpressureLatest()结合使用,可以获取最新的事件。

但是事实证明,这里有一个默认的大小为128的缓冲区。我得到的是以前已过时的事件的缓冲区。

那我如何获得实际的最新事件?

这是示例代码:

Flowable.interval(40, TimeUnit.MILLISECONDS)
            .doOnNext{
                println("doOnNext $it")
            }
            .onBackpressureLatest()
            .observeOn(Schedulers.single())
            .subscribe {
                println("subscribe $it")
                Thread.sleep(100)
            }

我所期望的:

doOnNext    0
    subscribe   0
doOnNext    1
doOnNext    2
    subscribe   2
doOnNext    3
doOnNext    4
doOnNext    5
    subscribe   5
doOnNext    6
doOnNext    7
    subscribe   7
doOnNext    8
doOnNext    9
doOnNext    10
    subscribe   10
...

我得到了什么

doOnNext    0
    subscribe   0
doOnNext    1
doOnNext    2
    subscribe   1
doOnNext    3
doOnNext    4
doOnNext    5
    subscribe   2
doOnNext    6
doOnNext    7
    subscribe   3
doOnNext    8
doOnNext    9
doOnNext    10
    subscribe   4
...
doOnNext    325
    subscribe   127
doOnNext    326
doOnNext    327
doOnNext    328
    subscribe   246
...

1 个答案:

答案 0 :(得分:5)

您的问题实际上出在observeOn上,默认情况下,该请求最多可请求128个项目,并将此请求最多传递到backpressureLatest,因此,该请求的行为将不符合您的预期。

您可以使用.observeOn(Scheduler,boolean,int)指定缓冲区大小,该大小应该可以解决您所看到的行为。