В моей системе есть следующее выражение cron:

0 0 0/1 1/1 * ? *

И знаешь, что? Я понятия не имею, что это значит. Парень, который написал это, уехал в отпуск на следующие 2 недели, так что я должен выяснить это на себе. Документацию можно найти здесь

Согласно документации, у нас есть:

* * * * * * *
| | | | | | | 
| | | | | | +-- Year              (range: 1970-2099)
| | | | | +---- Day of the Week   (range: 1-7 or SUN-SAT)
| | | | +------ Month of the Year (range: 0-11 or JAN-DEC)
| | | +-------- Day of the Month  (range: 1-31)
| | +---------- Hour              (range: 0-23)
| +------------ Minute            (range: 0-59)
+-------------- Second            (range: 0-59)

Хорошо, позвольте мне сказать вам, что я думаю: я считаю, что это выражение означает:

start when:
    seconds:        0
    minutes:        0
    hours:          0
    dayOfMonth      1
    monthOfYear     any
    dayOfWeek       any
    year            any

run every:
    1               hour
    1               dayOfWeek
when:
    dayOfWeek same as on first execution

Однако доступные мониторы выражений cron говорят, что это просто означает каждый час. Как тот, кто написал это, является Senior Java Dev, он должен знать любую причину для написания такого выражения вместо:

0 0 * * * * *

Мы используем org.springframework.scheduling.quartz.QuartzJobBean.

Краткое резюме

Что ж, я думаю, что мой вопрос: в чем разница между 0 0 0/1 1/1 * ? * и 0 0 * * * * *?

Изменить:

Документацию можно найти здесь.

28
xenteros 5 Сен 2016 в 13:12

3 ответа

Лучший ответ

0/1 означает начало в час 0 и повторение каждый 1 час
1/1 - начало первого дня месяца и выполнение каждый 1 день

Таким образом, этот шаблон выполняет cron один раз в час, начиная с первого дня месяца и повторяя себя каждый день.

есть требование использовать ? в одном из dayOfWeek или dayOfMonth:
Поддержка указания значения дня недели и дня месяца не завершена (в настоящее время вы должны использовать символ "?" в одном из этих полей). - xenteros 7 минут назад

Тогда 0 0 * * * ? * (а не 0 0 * * * *, с обязательным ?, как вы прокомментировали) будет таким же выражением, игнорируя секунды и минуты и принимая каждое значение других элементов, будет выполняться каждый час и каждый день .


По вашей информации:

0 0 0/1 1/1 * ? *
| |  |   |  | | | 
| |  |   |  | | +-- Year              (range: 1970-2099)
| |  |   |  | +---- Day of the Week   (range: 1-7 or SUN-SAT)
| |  |   |  +------ Month of the Year (range: 0-11 or JAN-DEC)
| |  |   +--------- Day of the Month  (range: 1-31)
| |  +------------- Hour              (range: 0-23)
| +---------------- Minute            (range: 0-59)
+------------------ Second            (range: 0-59)

И это объяснение специальных символов:

* («все значения»)

используется для выбора всех значений в поле. Например, «» в поле минут означает * «каждую минуту».

? («без конкретного значения»)

полезно, когда вам нужно указать что-то в одном из двух полей, в которых разрешен символ, но не в другом. Например, если я хочу, чтобы мой триггер сработал в определенный день месяца (скажем, 10-го числа), но мне все равно, какой это день недели, я бы поставил «10» в поле дня поле -месяц и "?" в поле дня недели.

/

используется для указания приращений. Например, «0/15» в поле секунд означает «секунды 0, 15, 30 и 45». А «5/15» в поле секунд означает «5, 20, 35 и 50 секунд». Вы также можете указать "/" после символа "" - в этом случае "" эквивалентно "0" перед "/". «1/3» в поле дня месяца означает «запускать каждые 3 дня, начиная с первого дня месяца».


Различия между * и ?

Чтобы объяснить разницу между ? и * в выражениях, прежде всего взгляните на эту таблицу:

Field Name      Mandatory   Allowed Values      Allowed Special Characters
Seconds         YES         0-59                , - * /
Minutes         YES         0-59                , - * /
Hours           YES         0-23                , - * /
Day of month    YES         1-31                , - * ? / L W   //allowed '?'
Month           YES         1-12 or JAN-DEC     , - * /
Day of week     YES         1-7 or SUN-SAT      , - * ? / L #   //allowed '?'
Year            NO          empty, 1970-2099    , - * /

Как видите, ? разрешен только в Day of month, а Day of week является обязательным в одном из обоих полей и сообщит Quartz, что это значение не было определено, поэтому используйте другое поле (если вы помещаете ? в Day of month, используемое значение будет Day of week).

27
Community 20 Июн 2020 в 09:12

Практической разницы между 0 0 * * * ? * и 0 0 0/1 1/1 * ? * нет

Анализируем разные оценки:
0/1 и * для часов - первое означает начинать с часа 0 каждый день и повторять каждый час, второе означает: повторять каждый час
1/1 и * для дней - первый означает начало с первого дня месяца и повторяется каждый день, а второй означает каждый день.

Причина, по которой кто-то использовал сложное выражение, возможно, заключается в том, что при тестировании выражение оценивалось в этой форме, и никто не брался за его упрощение, или, возможно, предыдущая версия cron работала иначе.

2
Javoslaw 14 Окт 2016 в 07:55

Не ответ, просто обновление правильного ответа @joc.

На данный момент это QuartzScheduler указывает на то, что ? может применяться в одном из двух положений: day_of_month или day_of_week.

Поддержка указания значения дня недели и дня месяца не завершена (в настоящее время вы должны использовать символ «?» В одном из этих полей).

Помимо приведенной выше ссылки, есть много примеров, которые помогут вам создать свой собственный.


+--------------------+-------------------------------------------------------------------------------------------------------------------------------------+
|   **Expression**   |                                                             **Meaning**                                                             |
+--------------------+-------------------------------------------------------------------------------------------------------------------------------------+
| 0 0 12 * * ?       | Fire at 12pm (noon) every day                                                                                                       |
| 0 15 10 ? * *      | Fire at 10:15am every day                                                                                                           |
| 0 15 10 * * ?      | Fire at 10:15am every day                                                                                                           |
| 0 15 10 * * ? *    | Fire at 10:15am every day                                                                                                           |
| 0 15 10 * * ? 2005 | Fire at 10:15am every day during the year 2005                                                                                      |
| 0 * 14 * * ?       | Fire every minute starting at 2pm and ending at 2:59pm, every day                                                                   |
| 0 0/5 14 * * ?     | Fire every 5 minutes starting at 2pm and ending at 2:55pm, every day                                                                |
| 0 0/5 14,18 * * ?  | Fire every 5 minutes starting at 2pm and ending at 2:55pm, AND fire every 5 minutes starting at 6pm and ending at 6:55pm, every day |
+--------------------+-------------------------------------------------------------------------------------------------------------------------------------+

0
Hearen 26 Июл 2019 в 07:35