即使存在数据,Spring WebFlux Mono.switchIfEmpty也将被调用

时间:2019-02-19 18:47:59

标签: spring spring-boot spring-webflux project-reactor

我是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 测试2 测试2

1 个答案:

答案 0 :(得分:2)

对于项目反应堆(通常在某种程度上在反应式编程中),事情发生在两个阶段:

  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()运算符来更好地了解此处发生的情况(订阅,反压等)。