В чем разница между block (), subscribe () и подпиской (-) - PullRequest
1 голос
/ 06 января 2020
Mono.delay(Duration.ofMillis(10)).map(d -> {
            System.out.println(d);
            return d;
        }).block();

ooutput : 0

Невозможно увидеть что-либо на консоли, когда я звоню с помощью методов subscribe () или subscribe (-) вместо block ()

Mono.delay(Duration.ofMillis(10)).map(d -> {
        System.out.println(d);
        return d;
    }).subscribe(System.out::println);

Нужно ли использовать только doOnSubscribe (-) после этого метода Mono.delay (-)?

 Mono.delay(Duration.ofMillis(10)).doOnSubscribe(s -> {
        System.out.println("its printing doOnSubscribe");
    }).map(d -> {
        System.out.println(d);
        return d;
    }).subscribe(System.out::println);

вывод его печать doOnSubscribe

1 Ответ

3 голосов
/ 06 января 2020

Ваш вызов block() явно удерживает основной поток до завершения работы издателя. К тому времени, когда он завершен, он выполняет вызов map(), поэтому печатает значение.

Ваш вызов subscribe(), с другой стороны, асинхронно выполняет Mono в отдельном планировщике, оставляя основной поток для полный. Поскольку планировщик, используемый по умолчанию, использует потоки демона для выполнения вашей подписки, ваша программа не будет ждать его завершения перед завершением.

Если вы введете задержку, достаточную для завершения Mono, вы ' Вы увидите ожидаемый результат:

Mono.delay(Duration.ofMillis(10)).map(d -> {
    System.out.println(d);
    return d;
}).subscribe(System.out::println);

Thread.currentThread().sleep(500);

0 затем будет напечатан дважды, один раз для вызова map() и один раз для System.out::println, используемого в качестве потребителя.

В реальном случае использования вы, очевидно, не просто введете произвольные sleep() вызовы - CountDownLatch будет более разумным выбором:

CountDownLatch cdl = new CountDownLatch(1);
Mono.delay(Duration.ofMillis(10))
        .map(d -> {
            System.out.println(d);
            return d;
        })
        .doOnTerminate(() -> cdl.countDown())
        .subscribe(System.out::println);
cdl.await();
...