0

现在我的代码如下所示:

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

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

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

我怎样才能实现它?

4

2 回答 2

1

最简单且直截了当的解决方案是编写一个代码,发送一个带有重试的请求,并且仅在成功完成或超出最大重试限制后才返回。之后将该代码包装为 Runnable 的实现并使用 ExecutorService 提交所有这些。将 Futures 收集到一个集合中,并检查它们何时完成。

于 2019-11-18T12:09:28.407 回答
1

Rather than going with ExecutorService suggested by another answer, I'd recommend using the capabilities of Mono and Flux which provides a more idiomatic solution:

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
}
于 2019-11-18T18:54:34.977 回答