RxJava2可观测背压
最近我意识到我不明白反压力是如何工作的 我做了一个小测试,我希望它会失败,出现RxJava2可观测背压,java,rx-java,rx-java2,backpressure,Java,Rx Java,Rx Java2,Backpressure,最近我意识到我不明白反压力是如何工作的 我做了一个小测试,我希望它会失败,出现missingBackpressureeException异常: @Test public void testBackpressureWillFail() { Observable.<Integer>create(e -> { for (int i = 0; i < 10000; i++) { System.out.println("Emit: "
missingBackpressureeException
异常:
@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();
}
为什么它不产生missingBackpressureeException
我希望e.onNext(I)
将项目放入observeObserveOn
的缓冲区,在其大小大于静态最终int buffer_size=Math.max(16,Integer.getInteger(“rx2.buffer size”,128).intValue()之后代码>
它应该抛出未发生的missingBackpressureeException
。缓冲区是否自动增长?如果没有,物品存放在哪里 这是因为只有使用RxJava2时,背压才会向外移动到Flowable
,请参见。
如果使用背压策略切换到可流动
。缺少
则会出现异常。
这也意味着,在您的情况下,确实有自动增长的缓冲区,
从observerOn
文档:
修改ObservableSource以在指定的计划程序上使用无边界缓冲区异步执行其发射和通知
RxJava2中的Observable
s不支持背压,只有Flowable
s我知道,它们不支持背压,但我认为这不支持意味着将抛出MissingBackpressureException,而不是缓冲区的自动增长。@RostyslavRoshak“Observable不支持背压”这意味着,当有一个源发出项目的速度快于使用者处理这些项目的速度时,这些项目将被无限地缓冲,直到由于资源短缺而引发OutOfMemory异常为止。但是,对于可流动的,只要缓冲区(有界)已满,就会抛出MissingBackpressureException。谢谢,请您解释一下,如果缓冲区是无界的,那么在Observable中有公共最终可观测observeOn(Scheduler Scheduler,boolean delayError,int bufferSize)的原因是什么?我认为缓冲区增长的大小是正确的吗?然而,我也认为,根据文档,这是“孤岛”的可配置大小,是缓冲区的增量步骤。@RostyslavRoshak事实上,此bufferSize参数仅用于缓冲区的增量步骤。默认情况下,可观察缓冲区的大小始终设置为128个元素,并根据需要递增。
Emit: 0
Emit: 1
Emit: 2
...
Emit: 10000
Processed:0
Processed:1
Processed:2
...
Processed:10000