当一个Mono抛出异常时,如何防止Mono.zip取消?

问题描述 投票:0回答:1

我是 Spring WebFlux 反应式编程的新手。我使用 Mono.zip 来组合三个 Mono,但是当其中一个 Mono 抛出异常时,整个 zip 操作将被取消,并且我无法从其他 Mono 获得结果。

如何确保即使其中一个 Monos 失败,我仍然可以从其他 Monos 获得结果?我不希望如果一个 Mono 出现错误,整个过程就会停止。

这是我当前的代码:



Mono<String> mono1 = Mono.just("Result 1");

Mono<String> mono2 = Mono.error(new RuntimeException("Error in mono2"));

Mono<String> mono3 = Mono.just("Result 3");


return Mono.zip(mono1, mono2, mono3)
           .map(tuple -> {

String result1 = tuple.getT1();
String result2 = tuple.getT2();
String result3 = tuple.getT3();
               return result1 + ", " + result2 + ", " + result3;
           });

提前致谢!

java
1个回答
0
投票

为了确保即使一个或多个 Mono 抛出异常,您的

Mono.zip
操作也能完成,您需要单独处理每个
Mono
的错误。默认情况下,如果
Mono.zip
中的任何 Monos 失败,整个操作都会被取消。但是,您可以使用
onErrorResume
onErrorReturn
来捕获错误并提供后备值,从而允许
Mono.zip
继续处理其他 Mono。

这是代码的修订版本:

Mono<String> mono1 = Mono.just("Result 1")
                        .onErrorReturn("Fallback for mono1");  // Return a default value on error
Mono<String> mono2 = Mono.error(new RuntimeException("Error in mono2"))
                        .onErrorResume(e -> Mono.just("Fallback for mono2"));  // Provide fallback Mono on error
Mono<String> mono3 = Mono.just("Result 3")
                        .onErrorReturn("Fallback for mono3");  // Return a default value on error

return Mono.zip(mono1, mono2, mono3)
        .map(tuple -> {
            String result1 = tuple.getT1();
            String result2 = tuple.getT2();
            String result3 = tuple.getT3();
            return result1 + ", " + result2 + ", " + result3;
        });

现在,即使

mono2
失败,
zip
操作也会继续,并且您仍然会收到
mono1
mono3
的结果。您将获得
mono2

的后备值,而不是取消整个过程
© www.soinside.com 2019 - 2024. All rights reserved.