Я запустил это:
Mono<Void> mono = Mono.empty();
System.out.println("mono.block: " + mono.block());
, и он выдаст:
mono.block: null
, как и ожидалось.Другими словами, вызов block
вернется немедленно, если Mono
уже завершен.
Еще один пример, напоминающий сценарий реального мира.У меня есть исходный поток, например:
Flux<Integer> ints = Flux.range(0, 2);
Я создаю подключаемый поток, который я буду использовать для разрешения нескольких подписчиков:
ConnectableFlux<Integer> publish = ints.publish();
Для этого примера, скажем, есть один реальный-работный подписчик:
publish
.doOnComplete(() -> System.out.println("publish completed"))
.subscribe();
и другой подписчик, который просто производит счетчик элементов:
Mono<Long> countMono = publish
.doOnComplete(() -> System.out.println("countMono completed"))
.count();
countMono.subscribe();
Я подключаю соединяемый поток и распечатываю счетчик элементов:
publish.connect();
System.out.println("block");
long count = countMono.block();
System.out.println("count: " + count);
Это печатает:
publish completed
countMono completed
block
Другими словами, оба подписчика подписываются успешно и завершают, но затем countMono.block()
блокирует на неопределенный срок.
Почему это так и как мне заставить это работать?Моя конечная цель - получить количество элементов.