如何将Monos列表合并为一个Mono。现在我要打个电话说5个服务,其中两个成功,但其中三个可能失败了。我想追踪所有失败和成功的情况。我尝试使用Mono.zipdelayError,但无法正常工作。每当出现错误时,都会涉及到我的资源异常处理程序。
仅供参考,我公开了一个rest API,该API将在内部调用许多返回Mono的服务,并且必须将这些调用的结果合并为一个Mono。
Mono<String> error = Mono.error(new RuntimeException());
error.onErrorResume(throwable-> Mono.just("hell0"));
Mono<String> test = Mono.just("test");
Mono<String> test1 = Mono.just("test1");
Mono<String> test2 = Mono.just("test2");
List<Mono<String>> monolist = new ArrayList<>();
monolist.add(test);
monolist.add(test1);
monolist.add(test2);
monolist.add(error);
Mono<Long> zipDelayError = Mono.zipDelayError(monolist, arrayObj -> Arrays.stream(arrayObj).count());
System.out.println(zipDelayError.block());
现在正在中断。
答案 0 :(得分:0)
如the Project reactor javadoc for Mono
中所述,Mono.zip
将:
将给定的Monos汇总到一个新的Mono中,当所有给定的Monos都生成一个项目时,将满足该要求,并根据提供的合并器函数汇总其值。任何来源的错误或为空的完成都将导致其他来源被取消,并且导致的Mono分别立即错误或完成。
这意味着对于以下示例:
Mono<User> user = ...
Mono<Account> account = ...
Mono<Info> info = ...
Mono<Tuple3<User, Account, Info>> tuple = Mono.zip(user, account, info);
您会得到一个:
Tuple
包含所有3个值Mono
,如果其中一个填写为空在最后两种情况下,其他情况将立即被取消,这意味着如果情况继续,您将不会知道是否会从中得到错误或有效元素。事情失败后,无法保留已经解决的价值。
有很多方法可以使行为更细化。
您可以在压缩后的Mono
或任何上游设备上,添加doOnError
运算符以记录失败的信息,甚至可以onErrorResume
使用后备操作;您还可以链接retry
运算符,以描述发生故障时应如何/何时重试。