1. Введение
В этом руководстве мы узнаем, как использовать аннотацию @Scheduled в Spring с cron expressions.
Cron expression, используемый в Spring, немного отличается от unix cron expression, так как требует дополнительного поля. Это может сбивать с толку некоторых из нас относительно использования sixth field.
Давайте начнём с того, что разберёмся в различных cron expression types, а затем узнаем, как настроить аннотацию @Scheduled в Spring.
2. Стандартный формат Cron Expression
В Unix-based systems и в большинстве online cron expression tools cron expressions обычно состоят из пяти полей, разделённых пробелами:
┌───────────── minute (0 - 59)
│ ┌───────────── hour (0 - 23)
│ │ ┌───────────── day of the month (1 - 31)
│ │ │ ┌───────────── month (1 - 12)
│ │ │ │ ┌───────────── day of the week (0 - 6) (Sunday to Saturday; 7 is also Sunday)
│ │ │ │ │
│ │ │ │ │
* * * * * command to execute
Каждое поле представляет собой определённую единицу времени и может содержать значения в диапазоне, указанном в скобках. Например, мы можем записать cron expression, чтобы указать выполнение задачи каждую пятницу в 18:00:
0 18 * * 5
Здесь asterisks означают значение «every», поэтому это выражение запустит задачу в 6 PM каждую пятницу.
Подставив этот cron expression в @Scheduled, наше Spring application даже не запустится, так как требуется другой формат. Давайте посмотрим, как мы можем использовать @Scheduled annotation в Spring.
3. Использование @Scheduled Annotation в Spring
Чтобы настроить задачу на выполнение в определённое время или с определённым интервалом в Spring application, мы можем использовать аннотацию @Scheduled вместе с cron expression:
@Scheduled(cron = "0 0 18 * * 5")
public void scheduledTask() {
// Task logic here
}
Аналогично, cron expression в этом примере будет запускать метод scheduledTask() каждую пятницу в 18:00. Мы видим, что формат похож на стандартный cron expression, но он требует дополнительного поля.
Итак, Spring расширяет стандартный формат, добавляя шестой параметр в начале для представления секунд:
┌───────────── second (0 - 59)
│ ┌───────────── minute (0 - 59)
│ │ ┌───────────── hour (0 - 23)
│ │ │ ┌───────────── day of the month (1 - 31)
│ │ │ │ ┌───────────── month (1 - 12)
│ │ │ │ │ ┌───────────── day of the week (0 - 7) (0 and 7 both represent Sunday)
│ │ │ │ │ │
* * * * * *
Более тонкий контроль над планированием задач позволяет нам управлять cron jobs вплоть до секунд. Однако стоит отметить, что system load может существенно влиять на фактическое время выполнения запланированных задач.
Стоит отметить, что чтобы включить планирование в Spring, нам нужно добавить аннотацию @EnableScheduling в наш класс конфигурации.
Cron expressions очень гибкие и становятся ещё более мощными, когда их комбинируют со специальными символами. Давайте ознакомимся с этими специальными символами.
4. Специальные символы в Cron Expressions
Так же, как и в стандартном cron syntax, Spring cron expressions поддерживают special characters, что обеспечивает большую гибкость.
Мы можем использовать звёздочку * чтобы обозначить все возможные значения для field. Альтернативно мы можем использовать вопросительный знак ? чтобы обозначить отсутствие конкретного значения, обычно используемого для day of the month или day of the week.
Например, чтобы запускать задачу в начале каждого часа каждый день недели:
@Scheduled(cron = "0 0 * * * ?")
Мы также можем указать несколько значений, разделив их запятой, или диапазон значений, используя дефис (-). Кроме того, мы можем использовать косую черту (/) для задания increments.
Например, чтобы запускать задачу каждые 2 часа по субботам и воскресеньям в период с первого по 15-е число месяца:
@Scheduled(cron = "0 0 0/2 1-15 * 6,7")
Как видно из предыдущего примера, мы можем комбинировать несколько special characters, чтобы создавать сложные scheduling patterns.
5. Заключение
В этой статье мы рассмотрели Cron expression в Spring и то, как использовать его с аннотацией @Scheduled. Сначала мы посмотрели на стандартный Unix cron expression format, а затем увидели, как Spring расширяет его, добавляя шестой параметр — seconds. Наконец, мы изучили, как использовать special characters для создания сложных scheduling patterns.


