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


203

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

@Scheduled(cron = "0 1 1 ? * *")
public void resetCache() {
    // ...
}



мое выражение 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- аннотация-поддержка


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


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 - час дня.


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 - это не кварц»
Сэнди Симонтон

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.