У меня есть приложение Spring Boot, которое использует аннотацию @Scheduled с фиксированной задержкой. Аннотация используется в разных классах с разными задержками. Однако каждый день в полночь все запланированные задачи перестают выполняться.
Кто-нибудь знает, почему это может происходить? Я не могу найти никаких объяснений в Интернете.
(Я использую версию 2.0.2.RELEASE для Spring Boot и 5.0.6.RELEASE для Spring Core.)
Заранее спасибо!
Убедитесь, что ОС, в которой вы работаете, не убивает потоки, это может убить фактический поток планирования.
Аннотация @Scheduled не использует функцию cron. Это выглядит так: @Scheduled (initialDelay = 10000, fixedDelay = 60000).
Я не уверен, как узнать, убивает ли моя ОС потоки, но я сбрасываю потоки Java сегодня до и после полуночи, чтобы увидеть, не пропадают ли некоторые из них. Я не думаю, что ОС это делает, потому что у меня есть несколько длительных потоков, не управляемых Spring, и они продолжают работать. К вашему сведению, я запускаю CentOS 7 внутри контейнера Docker. Хост - Debian 9.




Я не уверен, что вы имеете в виду, говоря о прекращении бега.
Но первое, что вам нужно сделать, это запустить свои расписания в разных потоках и поместить их в очередь.
Если остановка означает приостановку на некоторое время, то вы создаете новое расписание, которое заставляет другие расписания спать некоторое время в полночь. Возможно, новое расписание должно быть запущено, когда поток спит, и способ предотвратить это - убедиться, что только одно расписание (Я имею в виду такой же график) можно было бы поставить в очередь одновременно.
Если вы просто имеете в виду убить все остальные расписания в полночь, вам просто нужно начать свои полуночные расписания и убить других.
Прошу прощения за мой плохой английский, надеюсь, это может вам помочь.
Спасибо за ваш ответ. Я уже установил размер пула больше, чем количество запланированных задач в планировщике и исполнителе. Если я правильно понимаю, это означает, что они должны быть в разных потоках.
Когда я сказал «Остановка», я имел в виду, что задачи полностью остановлены, насколько я могу судить. Вчера я оставил приложение включенным более чем на 8 часов после последнего выполнения, и никаких действий со стороны задач больше не было.
Задачи не могут запускаться снова? Вы отключили пул потоков? Если пул потоков все еще работает, что, если вы выполните задачу с помощью планировщика, такого как ThreadPoolTaskScheduler?
@Scheduled(fixedDelay = 1000)
void scheduleFixedDelayTask() {
System.out.println(
"Fixed delay task - " + System.currentTimeMillis() /
1000);
}
В этом случае продолжительность между концом последнего выполнения и началом следующего выполнения является фиксированной. Задача всегда ожидает завершения предыдущей.
Эту опцию следует использовать, когда необходимо, чтобы предыдущее выполнение было завершено перед повторным запуском.
Поэтому поддерживайте задержку таким образом, чтобы предыдущее выполнение было завершено.
Надеюсь, поможет.
Спасибо всем, кто ответил.
Как оказалось, со Spring это не было проблемой. Оказалось, что задачи остановлены из-за остановки журналов. На самом деле произошло то, что наши сценарии, отслеживающие журналы, были недостаточно умны, чтобы обрабатывать файлы журналов, которые отправляются в полночь (лицо ладони).
Привет, Стивен, не могли бы вы подробнее объяснить, как решается проблема. Я столкнулся с той же проблемой с моим весенним планировщиком с некоторого времени.
Могу я увидеть одно из ваших запланированных выражений cron, которое останавливается?