我是 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;
});
提前致谢!
为了确保即使一个或多个 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
的后备值,而不是取消整个过程