Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RxJava2可观测背压_Java_Rx Java_Rx Java2_Backpressure - Fatal编程技术网

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