Реактор проекта: дождитесь завершения списка моно - PullRequest
1 голос
/ 27 января 2020

Я ожидаю, что код дождется завершения моно и затем соберет результаты, но этого не произойдет.

Почему?

Вот мой код:

public static void main(String[] args) throws Exception {
        Mono<Integer> mono1 = Mono.fromCallable(() -> 1);
        Mono<Integer> mono2 = Mono.fromCallable(() -> 2);
        List<Mono<Integer>> monos = Arrays.asList(mono1, mono2);

        Mono
                .when(monos)
                .subscribe(__ -> {
                    int i1 = mono1.block();
                    int i2 = mono1.block();

                    System.out.println(i1 + i2);
                });

        Thread.currentThread().join();
    }

1 Ответ

1 голос
/ 27 января 2020

Ваш Mono.when() вызов имеет тип Mono<Void> - он просто завершается (или выдает ошибки, если один из его издателей возвращает ошибку.) Таким образом, никогда не отправляется элемент, поэтому никогда не происходит вызов subscribe(), поэтому код в этом блоке подписки никогда не выполняется.

Непонятно, что именно вы хотите здесь сделать, но самое быстрое «исправление» может быть до materialize() перед подпиской, поэтому вы получаете сигнал onComplete(), распространяемый как элемент:

Mono
        .when(monos)
        .materialize()
        .subscribe(__ -> {
            int i1 = mono1.block();
            int i2 = mono1.block();

            System.out.println(i1 + i2);
        });

Обратите внимание, что здесь будет напечатано 2, а не 3, поскольку оба i1 и i2 ссылаются на mono1.

...