Как узнать, что все потоки завершены при весенней загрузке @ asyn c с @scheduled - PullRequest
0 голосов
/ 22 февраля 2020

Мне нужно вызвать REST API (50 вызовов одновременно), используя asyn c. Каждый вызов занимает некоторое время (20 секунд) для ответа, и после этого происходит некоторая обработка. Затем нужно знать, когда все потоки завершены, после того, как все потоки завершены, нужно вызвать этот API с 50 потоками. Как этого можно добиться весной.

1 Ответ

0 голосов
/ 22 февраля 2020

Лично мне нравится Проект реактора . Это дает вам гибкий способ конструировать то, о чем вы спрашиваете.

Вот пример возможной реализации:

@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"));
}

Я также подготовил минимальный проект, который вы можете найти в моем хранилище .

Вы можете запустить проект с помощью следующей команды: ./mvnw -pl async-scheduled-call-external-service clean spring-boot:run

...