1. Обзор
Выражения Cron позволяют нам планировать периодическое выполнение задач в определенную дату и время. После его появления в Unix другие операционные системы и программные библиотеки на основе Unix (включая Spring Framework) переняли его подход к планированию задач.
В этом кратком руководстве мы увидим, в чем разница между выражениями Cron в операционных системах на основе Unix и Spring Framework.
2. Юникс Крон
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. Весенний Крон
Чтобы запланировать периодические фоновые задачи в Spring, мы обычно передаем выражение Cron в аннотацию @Scheduled
.
В отличие от выражений Cron в системах на основе Unix, выражение Cron в Spring имеет шесть полей, разделенных пробелами: секунды, минуты, часы, день, месяц и день недели .
Например, чтобы запускать задачу каждые десять секунд, мы можем сделать:
*/10 * * * * *
Кроме того, чтобы запускать задачу каждые 20 секунд с 8 утра до 10 минут каждый день:
*/20 * 8-10 * * *
Как показано в приведенных выше примерах, первое поле представляет вторую часть выражения. В этом разница между двумя реализациями. Несмотря на разницу во втором поле, Spring поддерживает многие функции оригинального Cron, такие как числа диапазонов или списки.
С точки зрения реализации класс CronSequenceGenerator
отвечает за анализ выражений Cron в Spring.
4. Вывод
В этом кратком руководстве мы увидели разницу в реализации Cron между Spring и большинством систем на базе Unix. Попутно мы увидели несколько примеров обеих реализаций.
Чтобы увидеть больше примеров выражений Cron, настоятельно рекомендуется ознакомиться с нашим Руководством по выражениям Cron . Более того, просмотр исходного кода класса CronSequenceGenerator
может дать нам хорошее представление о том, как Spring реализует эту функцию.