Все cron-выражения в Spring должны соответствовать одному и тому же формату, независимо от того, используете ли вы их в аннотациях @Scheduled
, элементах task:scheduled-tasks
или где-то еще. Правильно сформированное выражение в формате cron, такое как * * * * * *
, состоит из шести полей времени и даты, разделенных пробелами, каждое из которых имеет свой диапазон допустимых значений:
┌───────────── секунда (0-59) │ ┌───────────── минута (0 - 59) │ │ ┌───────────── час (0 - 23) │ │ │ ┌───────────── день месяца (1 - 31) │ │ │ │ ┌───────────── месяц (1 - 12) (или JAN-DEC) │ │ │ │ │ ┌───────────── день недели (0 - 7) │ │ │ │ │ │ (0 или 7 – воскресенье, или MON-SUN) │ │ │ │ │ │ * * * * * *
Существуют определенные правила:
-
Поле может быть звездочкой (
*
), которая всегда обозначает "первый-последний". Для полей "день месяца" или "день недели" вместо звездочки можно использовать знак вопроса (?
). -
Запятые (
,
) используются для разделения элементов списка. -
Два числа, разделенные дефисом (
-
), выражают диапазон чисел. Заданный диапазон указывается включительно. -
После диапазона (или
*
) с помощью/
задается интервал значения числа через диапазон. -
Для полей "день месяца" и "день недели" также можно использовать английские имена. Используйте первые три буквы конкретного дня или месяца (регистр не имеет значения).
-
Поля "день месяца" и "день недели" могут содержать символ
L
, который имеет иное значение-
В поле "день месяца"
L
означает последний день месяца. Если за ним следует отрицательное смещение (т.е.L-n
), это означаетn
-дней до последнего дня месяца. -
В поле "день недели"
L
означает последний день недели. Если перед ним стоит цифра или трехбуквенное название (dL
илиDDDL
), это означает последний день недели (d
илиDDD
) в месяце.
-
-
Поле дня месяца может быть стоять
nW
, что означает ближайший будний день кn
-дню месяца. Еслиn
выпадает на субботу, это дает пятницу перед ней. Еслиn
выпадает на воскресенье, это дает следующий за ним понедельник, что также происходит, еслиn
равно1
и выпадает на субботу (т.е:1W
означает первый будний день месяца). -
Если в поле "день месяца" стоит
LW
, это означаетпоследний будний день месяца
. -
Поле "день недели" может быть
d#n
(илиDDD#n
), что означаетn-
й день неделиd
(илиDDD
) в месяце.
Вот несколько примеров:
Выражения в формате Cron | Значение |
---|---|
|
каждый час каждого дня |
|
каждые десять секунд |
|
8, 9 и 10 часов каждого дня |
|
6:00 утра и 7:00 вечера каждый день |
|
8:00, 8:30, 9:00, 9:30, 10:00 и 10:30 каждый день |
|
по часам с девяти до пяти в будние дни |
|
каждое Рождество в полночь |
|
последний день месяца в полночь |
|
предпоследний день месяца в полночь |
|
последняя пятница месяца в полночь |
|
последний четверг месяца в полночь |
|
первый будний день месяца в полночь |
|
последний будний день месяца в полночь |
|
во вторую пятницу месяца в полночь |
|
в первый понедельник месяца в полночь |
Макросы
Такие выражения, как 0 0 0 * * * * *
, разбирать человеку тяжело и, следовательно, трудно исправлять в случае ошибок. Для улучшения читабельности Spring поддерживает следующие макросы, которые представляют часто используемые последовательности. Можно использовать эти макросы вместо шестизначного значения, таким образом: @Scheduled(cron = "@hourly")
.
Макрос | Значение |
---|---|
|
раз в год ( |
|
раз в месяц ( |
|
раз в неделю ( |
|
один раз в день ( |
|
раз в час, ( |
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ