当数量不固定时,合并多个Monos的结果?

时间:2018-09-21 03:54:02

标签: project-reactor

如何将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()); 

现在正在中断。

1 个答案:

答案 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运算符,以描述发生故障时应如何/何时重试。