java Webflux重复方法在使用不同运算符时会出现奇怪的行为

iugsix8n  于 2022-11-27  发布在  Java
关注(0)|答案(1)|浏览(94)

Repeat操作符可以使流重新订阅,我发现了不同情况下的一些行为。
示例代码如下:

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

这肯定会影响流的执行顺序
然后我就疑惑了很多,什么情况下它会受影响还是不受影响?
非常感谢

j9per5c4

j9per5c41#

当你在Flux上调用then运算符时,它将在Flux完成之后**执行一次,包括重复。它不关心在它之前有多少个元素。这就是为什么你在上一个例子中只看到一个hello。在行尾添加了注解,以查看两种类型之间的切换。

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之前,则它将像其他操作一样重复

相关问题