最近我意识到我不明白RxJava2
背压是如何起作用的。
我做了一个小测试,我希望它会因MissingBackpressureException
异常而失败:
@Test
public void testBackpressureWillFail() {
Observable.<Integer>create(e -> {
for (int i = 0; i < 10000; i++) {
System.out.println("Emit: " + i);
e.onNext(i);
}
e.onComplete();
})
.subscribeOn(Schedulers.newThread())
.observeOn(Schedulers.computation())
.doOnNext(i -> {
Thread.sleep(100);
System.out.println("Processed:" + i);
})
.blockingSubscribe();
}
系统输出显示下一个:
Emit: 0
Emit: 1
Emit: 2
...
Emit: 10000
Processed:0
Processed:1
Processed:2
...
Processed:10000
为什么它不会产生MissingBackpressureException
。
我希望e.onNext(i);
将项置于ObservableObserveOn
的缓冲区中,并且在其大小大于static final int BUFFER_SIZE = Math.max(16,Integer.getInteger("rx2.buffer-size",128).intValue());
之后
它应该抛出MissingBackpressureException
这不会发生。缓冲区会自动增长吗?如果不存储物品的位置?
答案 0 :(得分:3)
这是因为只有RxJava2背压才会移到Flowable
,请参阅here。
如果您使用Flowable
切换到BackpressureStrategy.MISSING
,您将获得例外
这也意味着在你的情况下你确实有自动增长的缓冲区,
来自observerOn
docs:
修改ObservableSource以在指定的调度程序上执行其排放和通知,与无界缓冲区异步