Есть ли разница между? и * в выражениях 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 |
+--------------------+-------------------------------------------------------------------------------------------------------------------------------------+