Project reactor:flatMap之后的onErrorResume

时间:2018-03-22 14:43:56

标签: java project-reactor reactor reactive-streams

Flux.just("a", "b")
        .flatMap(s -> s.equals("a") ? Mono.error(new RuntimeException() : Flux.just(s + "1", s + "2"))
        .onErrorResume(throwable -> Mono.empty())
        .subscribe(System.out::println);

您好!

在这里,我制作了两个元素的流量,然后通过flatMap将第一个曝光到异常,第二个曝光到另一个光通量。

使用onErrorResume我期望输出

b1
b2

但什么都没得到。有谁可以解释为什么会发生,拜托?

感谢。

2 个答案:

答案 0 :(得分:4)

鉴于此:

Flux.just("a", "b", "c")
        .flatMap { s ->
            if (s == "b") 
                Mono.error<RuntimeException>(RuntimeException()) 
            else 
                Flux.just(s + "1", s + "2")
        }.onErrorResume { throwable -> Mono.just("d") }.log()
        .subscribe { println(it) }

输出结果为:

12:35:19.673 [main] INFO reactor.Flux.OnErrorResume.1 - onSubscribe(FluxOnErrorResume.ResumeSubscriber)
12:35:19.676 [main] INFO reactor.Flux.OnErrorResume.1 - request(unbounded)
12:35:19.677 [main] INFO reactor.Flux.OnErrorResume.1 - onNext(a1)
a1
12:35:19.677 [main] INFO reactor.Flux.OnErrorResume.1 - onNext(a2)
a2
12:35:19.712 [main] INFO reactor.Flux.OnErrorResume.1 - onNext(d)
d
12:35:19.713 [main] INFO reactor.Flux.OnErrorResume.1 - onComplete()

这里发生了什么? onErrorResume() 正在应用flatMap()运营商返回的发布商。由于在“b”发布者发出失败信号,flatMap()发布者不再执行,onErrorResume()运营商继续使用其回退进行发布。

documentation for onErrorResume()清楚地表明原始发布商因错误而终止并且后备接管:

enter image description here

答案 1 :(得分:1)

codependent已经为这个问题提供了扎实的答案,为什么会发生这种情况。要回答一些题外的如何实现预期的输出

onErrorResume调用必须移至flatMap

Flux.just("a", "b")
    .flatMap(s ->
        (s.equals("a") ? Mono.error<RuntimeException>(RuntimeException()) : Flux.just(s + "1", s + "2"))
             .onErrorResume(ex -> Mono.empty())
    )
    .subscribe(System.out::println)

这样输出就如预期的

b1
b2