В моей системе есть следующее выражение 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 * * * * *
?
Изменить:
Документацию можно найти здесь.
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
).
Практической разницы между 0 0 * * * ? *
и 0 0 0/1 1/1 * ? *
нет
Анализируем разные оценки:
0/1
и *
для часов - первое означает начинать с часа 0 каждый день и повторять каждый час, второе означает: повторять каждый час
1/1
и *
для дней - первый означает начало с первого дня месяца и повторяется каждый день, а второй означает каждый день.
Причина, по которой кто-то использовал сложное выражение, возможно, заключается в том, что при тестировании выражение оценивалось в этой форме, и никто не брался за его упрощение, или, возможно, предыдущая версия cron работала иначе.
Не ответ, просто обновление правильного ответа @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 |
+--------------------+-------------------------------------------------------------------------------------------------------------------------------------+
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.