Автор оригинала: Mona Mohamadinia.
1. Обзор
Выражения Cron позволяют нам планировать выполнение задач периодически в определенную дату и время. После его внедрения в Unix другие операционные системы и библиотеки программного обеспечения на базе Unix (включая Spring Framework) приняли его подход к планированию задач.
В этом кратком руководстве мы увидим, в чем разница между выражениями Cron в операционных системах на базе Unix и Spring Framework.
2. Unix Cron
Cron в большинстве систем на базе Unix имеет пять полей: минута (0-59), час (0-23), день месяца (1-31), месяцы (1-12 или имена) и день недели (0-7 или имена).
Мы можем поместить некоторые специальные значения в каждое поле, например звездочку (*):
5 0 * * *
Задание будет выполняться каждый день через 5 минут после полуночи. Также можно использовать диапазон значений:
5 0-5 * * *
Здесь планировщик будет выполнять задачу через 5 минут после полуночи, а также через 5 минут после 1, 2, 3, 4 и 5 часов каждый день.
Или мы можем использовать список значений:
5 0,3 * * *
Теперь планировщик выполняет задание через пять минут после полуночи и через пять минут после 3 часов каждый день. Оригинальное выражение Cron предлагает гораздо больше возможностей, чем то, что мы рассматривали до сих пор.
Однако он имеет одно большое ограничение: мы не можем планировать задания со второй точностью, так как у него нет выделенного второго поля.
Давайте посмотрим, как Spring удается устранить это ограничение.
3. Пружинный Крон
Чтобы запланировать периодические фоновые задачи весной, мы обычно передаем выражение Cron в аннотацию @Scheduled .
В отличие от выражений Cron в системах на базе Unix, выражение Cron в Spring имеет шесть полей, разделенных пробелами: секунда, минута, час, день, месяц и день недели .
Например, для выполнения задачи каждые десять секунд мы можем сделать:
*/10 * * * * *
Кроме того, запускать задачу каждые 20 секунд с 8 утра до 10 часов каждый день:
*/20 * 8-10 * * *
Как показано в приведенных выше примерах, первое поле представляет вторую часть выражения. В этом разница между двумя реализациями. Несмотря на разницу во втором поле, Spring поддерживает многие функции из исходного Cron, такие как номера диапазонов или списки.
С точки зрения реализации, класс CronSequenceGenerator отвечает за анализ выражений Cron весной.
4. Заключение
В этом коротком уроке мы увидели разницу в реализации Cron между Spring и большинством систем на базе Unix. По пути мы увидели несколько примеров обеих реализаций.
Чтобы увидеть больше примеров выражений Cron, настоятельно рекомендуется ознакомиться с нашим Руководством по выражениям Cron . Более того, взглянув на исходный код класса CronSequenceGenerator , мы можем получить хорошее представление о том, как Spring реализует эту функцию.