Объясните, как аннотация @Async работает с задачами @Scheduled. Например, у меня есть класс:
@Configuration
@EnableScheduling
@ConditionalOnProperty(name = "scheduler.enabled", matchIfMissing = true)
@RequiredArgsConstructor
@EnableAsync
public class Scheduler {
private final ReportService reportService;
@Scheduled(cron = "${scheduler.create-reports.cron}")
@Async
public void createDailyReports() {
// TODO: Make request to team-service to find all students id's. Then create new empty reports
List<Long> studentIdList = new ArrayList<>();
reportService.createEmptyDailyReports(studentIdList);
}
}
Необходимо ли аннотировать внутренний метод reportService.createEmptyDailyReports с помощью @Async для обработки всего createDailyReports() в асинхронном режиме или @Async на createDailyReports() достаточно?
На мой взгляд, одного @Async достаточно. Спасибо за объяснение
Я имею в виду, действительно ли это будет асинхронно, если у меня есть синхронный вызов метода внутри асинхронного запланированного метода?




По сути, аннотация @Aysnc использует SimpleAsyncTaskExecutor, который реализован для запуска нового потока для каждой задачи, выполняя его асинхронно.
Асинхронная аннотация по умолчанию использует SimpleAsyncTaskExecutor. Как упоминалось в документации, этот исполнитель не использует потоки повторно!, а запускает новый поток для каждого вызова. Однако он поддерживает ограничение параллелизма. По умолчанию количество одновременных потоков не ограничено. Это означает, что каждый вызов метода, помеченного аннотацией Async, будет выполняться в новом потоке.
Теперь, благодаря аннотации @Async, запланированный метод будет каждый раз выполняться асинхронно с новым потоком. Вот пример с дополнительной информацией.
Не забудьте добавить аннотации @EnableAsync и @EnableScheduling в класс конфигурации или основной класс.
Хорошо, теперь я узнал, что одного @Async достаточно, спасибо!
Зачем вам запускать его асинхронно, если он и так работает в отдельном планировщике?