【问题标题】:Webflux repeat method has strange behaviors with different operatorsWebflux repeat 方法在使用不同的运算符时会出现奇怪的行为
【发布时间】:2022-11-27 07:27:13
【问题描述】:

重复操作符可以让流重新订阅,我发现了一些在不同情况下的行为。

示例代码如下:

Mono.just(5)
        .doOnNext(i -> System.out.println("next 1: " + i))
        .doOnNext(i -> System.out.println("next 2: " + i))
        .doOnNext(i -> System.out.println("next 3: " + i))
        .repeat(2)
        .subscribe();

输出:

next 1: 5
next 2: 5
next 3: 5
next 1: 5
next 2: 5
next 3: 5
next 1: 5
next 2: 5
next 3: 5

这当然是对的。然后我改变重复位置。

Mono.just(5)
        .doOnNext(i -> System.out.println("next 1: " + i))
        .repeat(2)
        .doOnNext(i -> System.out.println("next 2: " + i))
        .doOnNext(i -> System.out.println("next 3: " + i))
        .subscribe();

输出与之前相同。

next 1: 5
next 2: 5
next 3: 5
next 1: 5
next 2: 5
next 3: 5
next 1: 5
next 2: 5
next 3: 5

所以我觉得不能影响原始流的执行顺序。

当我将 then 运算符添加到流中时。

Mono.just(5)
        .doOnNext(i -> System.out.println("next 1: " + i))
        .doOnNext(i -> System.out.println("next 2: " + i))
        .then(Mono.just("hello"))
        .doOnNext(i -> System.out.println("next 3: " + i))
        .repeat(2)
        .subscribe();

输出:

next 1: 5
next 2: 5
next 3: hello
next 1: 5
next 2: 5
next 3: hello
next 1: 5
next 2: 5
next 3: hello

好像重新订阅了所有的流,我又换了位置。

Mono.just(5)
        .doOnNext(i -> System.out.println("next 1: " + i))
        .repeat(2)
        .doOnNext(i -> System.out.println("next 2: " + i))
        .then(Mono.just("hello"))
        .doOnNext(i -> System.out.println("next 3: " + i))
        .subscribe();

输出:

next 1: 5
next 2: 5
next 1: 5
next 2: 5
next 1: 5
next 2: 5
next 3: hello

这当然是可能会影响流的执行顺序.

那我就很迷茫了,什么情况会影响不影响呢?

非常感谢

【问题讨论】:

    标签: java spring-webflux project-reactor


    【解决方案1】:

    当您在 Flux 上调用 then 运算符时,它将恰好执行一次Flux完全的包括重复。它不关心它之前有多少元素。这就是为什么您在最后一个示例中只看到一个 hello 的原因。在行末添加 cmets 以查看两种类型之间的切换。

    Mono.just(5)
            .doOnNext(i -> System.out.println("next 1: " + i)) // mono
            .repeat(2) // flux
            .doOnNext(i -> System.out.println("next 2: " + i))  // flux
            .then(Mono.just("hello")) // mono  (triggered after previous Flux completed)
            .doOnNext(i -> System.out.println("next 3: " + i)) // mono 
            .subscribe();
    

    如果 then 运算符出现在 repeat 之前,那么它将像其他所有内容一样重复

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多