Лично мне нравится Проект реактора . Это дает вам гибкий способ конструировать то, о чем вы спрашиваете.
Вот пример возможной реализации:
@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