Овервью
В бизнес логике бывают различные сценарии и некоторые из них требуют задачи, которые выполняются по некоторому таймеру. Например отправка несрочных данных в другие сервисы, повторные попытки выполнения бизнес логики и так далее. Для этого существуют различные пути решения, например утилита crontab в Linux. Однако, этот способ далеко не лучший, так как в таком случае вызов бизнес логки выносится в отдельную конфигурацию, которую надо поддерживать и отдельно хранить. Есть еще различные решения для Java, такие как библиотека Quartz или встроенная в Spring аннотация @Scheduled, которую мы сегодня и рассмотрим.
Детали
Аннотация @Scheduled позволяет легко и просто с контексте Spring настроить запланированные задачи, которые будут выполняться, например, с промежутком раз в минуту, или раз в день в определенное время.
Пример:
@Scheduled(fixedDelay = 1000)
public void sampleFixedDelayTask() {
System.out.println("Hello World!");
}
Однако для работы этой аннотации необходимо в классе помеченном @Configuration поставить еще одну аннотацию @EnableScheduling.
@Configuration
@EnableScheduling
public class SampleConfig {
}
Также задачу можно сделать ассинхронной, например, если задача выполняется довольно часто и занимает большое количество времени, то следующая задача не выполнится, пока не завершится предыдущая, для этого необходимо добавить в класс конфигурации аннотацию @EnableAsync и пометить методы бизнес логики аннотацией @Async.
@Async
@Scheduled(fixedDelay = 1000)
public void sampleFixedDelayTask() {
System.out.println("Hello World!");
}
Также, важным моментом является, что методы, реализующие запланированные задачи не должны принимать параметры и возвращать значения.