Spring @Scheduled (cron = "0 * * * *?") Не запускается каждый час

Использование Spring Boot 1.5.4. @Scheduled(cron = "0 * * * * ?") должен запускать задачу каждую минуту. В одной из моих систем он отлично работает каждую минуту, но в другой системе (CentOS 6.3) он не запускается каждый час, то есть он запускается в 14:58, запускается в 14:59, не запускается в 15:00, а затем бег в 15:01. Что вызовет эту проблему? как я могу отладить и выяснить причину, по которой он не работает на ожидаемом мной уровне?

Вы должны протестировать это на freeformatter.com/cron-expression-generator-quartz.html

Scary Wombat 17.10.2018 07:13

Думаю, каждую минуту должно быть * / 1 * * * *?

Pushpesh Kumar Rajwanshi 17.10.2018 07:20

@PushpeshKumarRajwanshi первая цифра - вторая, а вторая цифра - минуты, согласно Spring doc. Вы предлагаете `* * / 1 * * *?`

guo 17.10.2018 07:22

Хорошо, в таком случае да, это должно быть * * / 1 * * *?

Pushpesh Kumar Rajwanshi 17.10.2018 07:23

cronmaker (cronmaker.com) предлагает выражение cron для каждой минуты 0 0/1 * 1/1 *? *

this_is_om_vm 17.10.2018 09:33
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
1 289
1

Ответы 1

Это всего лишь гипотеза, но если предположить, что выражение Cron правильное (в противном случае просто проверьте его еще раз) и ведет себя по-разному на разных машинах, возможной причиной может быть следующее:

@Scheduled по умолчанию работает таким образом, что открывает однопоточный java.util.Timer.

Поэтому, если код выполняемого метода выполняется более одной минуты, последующий вызов будет отложен (не произойдет) только потому, что поток уже «занят».

Итак, чтобы проверить себя, попробуйте сделать следующее:

Определите метод @Scheduled так, чтобы он запускался каждую минуту, но просто выводил какое-то сообщение в журнал (так что это наверняка займет меньше одной минуты). Если вы видите, что теперь он ведет себя правильно, значит, это действительно проблема, если нет - это должно быть где-то еще.

Другие вопросы по теме