【问题标题】:How to collect results from parallel web requests with Spring WebClient?如何使用 Spring WebClient 从并行 Web 请求中收集结果?
【发布时间】:2019-12-20 23:54:17
【问题描述】:

我想发送并行 Web 请求并同时收集结果。 然后我的方法应该返回聚合结果。

使用spring-webfluxWebClient 听起来很简单。但是我如何才能真正汇总结果呢?

public List<Response> aggregate(List<Object> bodys) {
    List<Mono> monos = bodys.stream(body -> send(body)).collect(Collectors.toList());

    //TODO how can I get all results in parallel and collect it to a response list?
    List<Response> = Flux.merge(monos)...???...collectList(); //pseudeocode
}

private Mono<Response> send(Object body) {
   return webClient.post().syncBode(body).bodyToMono(type);
}

重要的是:如果其中一个单声道以异常结束,其他单声道仍应执行而不是中止。

【问题讨论】:

标签: java spring spring-webflux spring-webclient


【解决方案1】:

您需要在内部 Monos 上应用错误处理:

public Mono<List<Response>> aggregate(List<Object> bodies)
{
    return Flux.fromIterable(bodies)
               .flatMap(body -> send(body).onErrorResume(e -> Mono.empty()))
               .collectList();
}

private Mono<Response> send(Object body)
{
    return WEB_CLIENT.post().syncBody(body).retrieve().bodyToMono(Response.class);
}

【讨论】:

  • 好吧,但我想返回 List&lt;Response&gt;,而不是 Mono!
  • 那么就可以在collectList之后调用block了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-21
  • 2013-10-08
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 2020-03-30
  • 1970-01-01
相关资源
最近更新 更多