如何并行调用多个 http 请求(具有重试功能)并等待所有请求完成?

How to call several http requests in parallel(with retry functionality) and await when all of them are finish?

现在我的代码是这样的:

   List<Mono<ResponseEntity<String>>> response = queue.stream()
            .map(req-> webClient
                    .post()
                    .bodyValue(req)
                    .retrieve()
                    .toEntity(String.class)
            )
            .collect(Collectors.toList());

我怎么能等到所有回复都被接受的那一刻?

如果某些请求失败了,我只想重试它们。

如何实现?

最简单和直接的解决方案是编写一个代码,发送一个带有重试的请求,并且 returns 只有在它成功完成或 运行 超出重试的最大限制之后。之后将该代码包装为 Runnable 的实现,并使用 ExecutorService 提交所有代码。将 Futures 收集到一个集合中,并检查它们何时全部完成。

与其使用另一个答案建议的 ExecutorService,我建议使用 MonoFlux 的功能,它们提供了更惯用的解决方案:

Mono<List<String>> response = Flux.fromIterable(queue)
                                  .flatMap(this::callHttp)
                                  .collectList();

private Mono<String> callHttp(String req)
{
    return webClient
            .post()
            .syncBody(req)
            .retrieve()
            .bodyToMono(String.class)
            .retry(3); // retries failed requests at most 3 times
}