如何并行调用多个 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
,我建议使用 Mono
和 Flux
的功能,它们提供了更惯用的解决方案:
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
}
现在我的代码是这样的:
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
,我建议使用 Mono
和 Flux
的功能,它们提供了更惯用的解决方案:
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
}