Есть ли разница между? и * в выражениях cron? Странный пример

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

0 0 0/1 1/1 * ? *

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

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

* * * * * * *
| | | | | | | 
| | | | | | +-- 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 говорят, что это просто означает каждый час. Как тот, кто написал, что это старший Java-разработчик, он должен знать любую причину написания такого выражения вместо:

0 0 * * * * *

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

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

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

Изменить:

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

Ответ 1

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

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

есть требование использовать ? в одном из dayOfWeek или dayOfMonth:
Поддержка указания значения дня недели и дня месяца не завершена (в настоящее время необходимо использовать символ character ? в одном из этих полей). - 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).

Ответ 2

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

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

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

Ответ 3

Не ответ, просто обновление к правильному ответу @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 |
+--------------------+-------------------------------------------------------------------------------------------------------------------------------------+