Spring WebFlux Mono.switchIfEmpty вызывается даже при наличии данных - PullRequest
0 голосов
/ 19 февраля 2019

Я новичок в Spring webflux.Необходимо понимать, почему вызывается оператор Mono.switchIfEmpty, даже если данные не пусты.

Пример кода:

public static void main(String[] args) {
    Mono.just("test1")
            .flatMap(val -> {
                System.out.println("test2");
                return Mono.just("test2");
            })
            .switchIfEmpty(method1())
            .subscribe(s -> System.out.println(s));
}

private static Mono<String> method1() {
    System.out.println("test3");
    return Mono.empty();
}

Вывод

test3 test2 test2

1 Ответ

0 голосов
/ 20 февраля 2019

В проектном реакторе (и в реактивном программировании в целом, в некоторой степени) все происходит в два этапа:

  1. Настройка реактивного конвейера
  2. Фактическое выполнение этогоконвейер, как только Subscriber подписывается на него

В вашем случае вызов method1 выполняет этот метод, а ваш System.out.println выполняется, как ожидается.

Если вы хотитечтобы увидеть больше в соответствии с выполнением конвейера, вы можете попробовать:

private static Mono<String> method1() {
    return Mono.defer(() -> {
        System.out.println("test3");            
        return Mono.empty()
    });
}

Оператор Mono.defer будет откладывать эту операцию до подписки на конвейер.

Существуют лучшие способыдостигните этого, хотя:

  • вы можете использовать один из множества DoOnXYZ операторов, которые предназначены для таких побочных действий, как
  • , вы можете использовать оператор log() дляполучить лучшее представление о том, что здесь происходит (подписка, противодавление и т. д.).
...