Разница между * и? в Spring @Scheduled (cron = "....." )
Я рассматривал пример загрузки Spring для планирования задач (https://spring.io/guides/gs/scheduling-tasks/) и чтения некоторой документации (https://javahunter.wordpress.com/2011/05/05/cronscheduler-in-spring/), и я вижу, что * и? используются почти взаимозаменяемо.
Например, строка
@Scheduled(cron = "0 15 10 ? * *")
и
@Scheduled(cron = "0 15 10 * * ?")
выполните то же самое. Так в чем разница между * и?
Ответы
Ответ 1
asterix обозначает все возможные значения. вопросительные знаки должны использоваться для нестандартного значения
* ( "все значения" ) - используется для выбора всех значений в поле. Например, "в минутном поле означает *" каждую минуту ".
? (" нет конкретного значения ") - полезно, когда вам нужно указать что-то в одно из двух полей, в которых допускается символ, но не Другие. Например, если я хочу, чтобы мой триггер срабатывал в определенный день месяца (скажем, 10-го), но неважно, в какой день недели, что случается, я бы поставил" 10 "в поле" день месяца "и"?" в день недели. Для пояснения см. Примеры ниже.
Скопировано из tutorial
Ответ 2
Учебник устарел. Символ ?
означает точно, чем *
. Начиная с Spring 3.1.2.RELEASE, иерархия вызовов:
Конструктор CronTrigger(String)
вызывает конструктор CronSequenceGenerator(String)
, который вызывает parse(String)
, который вызывает setDays(BitSet bits, String field, int max)
. Его реализация ясна:
private void setDays(BitSet bits, String field, int max) {
if (field.contains("?")) {
field = "*";
}
setNumberHits(bits, field, 0, max);
}
Итак, если ?
, то *
.