如何知道春季启动@async并使用@scheduled完成所有线程

问题描述 投票:0回答:1

我需要使用异步调用REST API(一次调用50个)。每个呼叫都需要一些时间(20秒)来响应,然后进行一些处理。然后需要知道所有线程何时完成,一旦再次完成所有线程,则需要使用50个线程来调用该api。春季如何实现。

spring asynchronous completable-future
1个回答
0
投票

个人,我喜欢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

© www.soinside.com 2019 - 2024. All rights reserved.