Spring загрузка аннотации @Async с @Scheduled

Объясните, как аннотация @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 достаточно. Спасибо за объяснение

Зачем вам запускать его асинхронно, если он и так работает в отдельном планировщике?

jbx 30.04.2024 20:04

Я имею в виду, действительно ли это будет асинхронно, если у меня есть синхронный вызов метода внутри асинхронного запланированного метода?

IvanDx 30.04.2024 20:10
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

По сути, аннотация @Aysnc использует SimpleAsyncTaskExecutor, который реализован для запуска нового потока для каждой задачи, выполняя его асинхронно.

Детали реализации:

Асинхронная аннотация по умолчанию использует SimpleAsyncTaskExecutor. Как упоминалось в документации, этот исполнитель не использует потоки повторно!, а запускает новый поток для каждого вызова. Однако он поддерживает ограничение параллелизма. По умолчанию количество одновременных потоков не ограничено. Это означает, что каждый вызов метода, помеченного аннотацией Async, будет выполняться в новом потоке.

Теперь, благодаря аннотации @Async, запланированный метод будет каждый раз выполняться асинхронно с новым потоком. Вот пример с дополнительной информацией.

Не забудьте добавить аннотации @EnableAsync и @EnableScheduling в класс конфигурации или основной класс.

Хорошо, теперь я узнал, что одного @Async достаточно, спасибо!

IvanDx 01.05.2024 08:56

Другие вопросы по теме