Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.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
Java subscribe(consumer、errorConsumer、CompleteCumer、subscriptionConsumer)不调用consumer和CompleteCumer?_Java_Project Reactor - Fatal编程技术网

Java subscribe(consumer、errorConsumer、CompleteCumer、subscriptionConsumer)不调用consumer和CompleteCumer?

Java subscribe(consumer、errorConsumer、CompleteCumer、subscriptionConsumer)不调用consumer和CompleteCumer?,java,project-reactor,Java,Project Reactor,作为主题,Mono.subscribe的第四个变体似乎没有调用成功消费者和完整消费者。它只调用订阅使用者 下面的代码失败 CountDownLatch latch = new CountDownLatch(3); Mono.just(1).subscribe(i -> latch.countDown(), throwable -> {}, latch::countDown, s -> latch.countDown()); boolean success

作为主题,
Mono.subscribe
的第四个变体似乎没有调用成功消费者和完整消费者。它只调用订阅使用者

下面的代码失败

    CountDownLatch latch = new CountDownLatch(3);
    Mono.just(1).subscribe(i -> latch.countDown(), throwable -> {}, latch::countDown, s -> latch.countDown());
    boolean success = latch.await(1, TimeUnit.SECONDS);
    Assert.assertEquals(true, success);

这是因为带有
消费者
订阅
版本旨在让您驱动初始
请求
。如果您没有在消费者中对订阅调用
request(n)
,则不会发出任何数据,
Mono
将无法完成

这与预期的效果一样:

CountDownLatch latch = new CountDownLatch(3);
Mono.just(1).subscribe(
            i -> latch.countDown(),
            throwable -> {},
            latch::countDown,
            s -> {
                s.request(Long.MAX_VALUE);
                latch.countDown();
            });
boolean success = latch.await(1, TimeUnit.SECONDS);
Assert.assertEquals(true, success);

谢谢@SimonBaslé,但是方法名表明它正在订阅。因此,用户必须使用传递到那里的订阅手动请求,这有点误导。在javadoc上没有给出任何线索。我同意,这应该更清楚。参数的描述中提到了这一点:“@param subscriptionConsumer要在订阅信号时调用的使用者,用于初始{@link Subscription#request(long)request},或null用于max request”