Весеннее выражение cron на каждый день 1: 01: am

203

Я пытаюсь, чтобы мой код выполнялся по фиксированному расписанию на основе выражения cron Spring. Я хотел бы, чтобы код выполнялся каждый день в 1: 01: утра. Я попробовал следующее выражение, но это не сработало для меня. Что не так с синтаксисом здесь?

@Scheduled(cron = "0 1 1 ? * *")
public void resetCache() {
    // ...
}
D-Man
источник
quartz-scheduler.org/api/2.2.1/org/quartz/…
Канагавелу Сугамар
мое выражение cron 0 0 0 1 JAN MON работал до прошлого года. 1 января перестал работать, сказав неверное выражение cron. Хотя это было предназначено для очень меньшей частоты, но мы смогли запустить сервер tc. после 1 января этого не произошло. Когда я изменил на 0 0 7? * Солнце это начало работать. Мне любопытно узнать, почему 0 0 0 1 ЯН МОН перестал работать там, где это было хорошо в прошлом году, Ян.
Спандей
0 0 0 1 JAN MON может быть неправильным выражением, ну, в этом тоже оно работало, и tc server никогда не жаловался
spandey

Ответы:

574

Попробуйте с:

@Scheduled(cron = "0 1 1 * * ?")

Ниже вы можете найти примеры шаблонов с весеннего форума:

* "0 0 * * * *" = the top of every hour of every day.
* "*/10 * * * * *" = every ten seconds.
* "0 0 8-10 * * *" = 8, 9 and 10 o'clock of every day.
* "0 0 8,10 * * *" = 8 and 10 o'clock of every day.
* "0 0/30 8-10 * * *" = 8:00, 8:30, 9:00, 9:30 and 10 o'clock every day.
* "0 0 9-17 * * MON-FRI" = on the hour nine-to-five weekdays
* "0 0 0 25 12 ?" = every Christmas Day at midnight

Выражение Cron представлено шестью полями:

second, minute, hour, day of month, month, day(s) of week

(*) значит соответствует любому

*/X означает «каждый икс»

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

PS: Чтобы заставить его работать, не забудьте включить его в контексте вашего приложения: https://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/scheduling.html#scheduling- аннотация-поддержка

gipinani
источник
15
Формат также задокументирован весной здесь - docs.spring.io/spring/docs/3.0.x/api/org/springframework/…
chrismarx
1
Я предполагаю, что Spring Cron также может обеспечить предоставление секунд, но обычный Unix Cron основан на минутах ... так как в man-страницах Unix минута - это наименьшая единица времени, которую можно настроить.
Нанософт
8
в чем значение "?" персонаж? Относится ли это только к полю «дни недели»? Будет ли это работать / делать что-то другое, если мы заменим '?' с '*' в примере на Рождество?
арест
1
@encrest посмотрите здесь: stackoverflow.com/questions/11499740/…
gipinani
1
Хороший учебник на < quartz-scheduler.org/documentation/quartz-2.x/tutorials/… >
Трей Джонн
90

Для моего планировщика я использую его для стрельбы в 6 часов утра каждый день, и моя запись cron:

0 0 6 * * *

Если вы хотите 1: 01: утра, затем установите его на

0 1 1 * * *

Полный код для планировщика

@Scheduled(cron="0 1 1 * * *")
public void doScheduledWork() {
    //complete scheduled work
}

** ОЧЕНЬ ВАЖНО

Чтобы быть уверенным в правильности времени запуска вашего планировщика, вы должны установить значение зоны следующим образом (я в Стамбуле):

@Scheduled(cron="0 1 1 * * *", zone="Europe/Istanbul")
public void doScheduledWork() {
    //complete scheduled work
}

Вы можете найти полные значения часового пояса здесь .

Примечание. Моя версия среды Spring: 4.0.7.RELEASE

Бахадир Тасдемир
источник
1
Я не знаю, почему у вашего ответа только 12, хотя это единственный правильный ответ здесь!
2
Большое спасибо @MoayadAbuJaber. Оценка не важна, если разработчики могут решить свои проблемы с моими ответами, достаточно, ура.
Бахадир Тасдемир
Могу ли я использовать зону с XML-конфигуратором <task:scheduled ref="paypalCronJob" method="runTask" cron="0 0 6 * * * ?"/>?
Шариф
3
большие пальцы за упоминание часового пояса
Forhad
2
Спасибо, @Forhad. Если вы являетесь разработчиком и имеете дело с какими-либо проблемами, связанными с датами и временем, вы должны знать детали временных меток, часовых поясов и конверсий. В противном случае ваши данные будут чепухой
Бахадир Тасдемир
22

Вы можете использовать аннотировать ваш метод с @Scheduled(cron ="0 1 1 * * ?") .

0 - для секунд

1- 1 минута

1 - час дня.

user3298173
источник
12

Чего-то не хватает в ответе Гипинани

@Scheduled(cron = "0 1 1,13 * * ?", zone = "CST")

Это будет выполнено в 1.01 и 13.01. Его можно использовать, когда вам нужно запускать задание без шаблона несколько раз в день.

А атрибут зоны очень полезен при развертывании на удаленных серверах. Это было введено с весны 4.

Малеен Абевардана
источник
2
Обратите внимание, что поддержка сокращений (для часового пояса) предназначена только для совместимости с JDK 1.1.x, и должны использоваться полные имена - согласно javadoc
slashron
6

Я заметил одну вещь: пружинный CronTrigger - это не cron. Вы можете получить 7 параметров в действительном выражении cron (которое вы можете проверить на cronmaker.com), а затем Spring не примет его. В большинстве случаев вы просто удаляете последний параметр, и все работает нормально.

Ирлан Сидаде
источник
1
«CronTrigger - это не кварц»
Сэнди Симонтон