我需要使用异步调用REST API(一次调用50个)。每个呼叫都需要一些时间(20秒)来响应,然后进行一些处理。然后需要知道所有线程何时完成,一旦再次完成所有线程,则需要使用50个线程来调用该api。春季如何实现。
个人,我喜欢Project reactor。它为您提供了一种灵活的方式来构造您要询问的内容。
以下是可能的实现方式的示例:
@Async
@Scheduled(cron = "*/10 * * * * *")
public void job() {
log.info("Cron job has been triggered");
Flux<ResponseEntity<Void>> externalCall = Flux
.range(1, 5)
.parallel()
.runOn(elastic())
.flatMap(i -> {
log.info("Call external service {}", i);
return webClient.get().retrieve().toBodilessEntity();
})
.sequential();
Flux
.from(externalCall)
.thenMany(Flux.defer(
() -> {
log.info("First execution completed. Call external service one more time");
return externalCall;
})
)
.last()
.subscribe(i -> log.info("Execution completed"));
}
我还准备了一个最小的项目,您可以在my repository中找到。
您可以使用以下命令运行项目:./mvnw -pl async-scheduled-call-external-service clean spring-boot:run