@Scheduled (fixedDelay = ...) Spring останавливается в полночь

У меня есть приложение Spring Boot, которое использует аннотацию @Scheduled с фиксированной задержкой. Аннотация используется в разных классах с разными задержками. Однако каждый день в полночь все запланированные задачи перестают выполняться.

Кто-нибудь знает, почему это может происходить? Я не могу найти никаких объяснений в Интернете.

(Я использую версию 2.0.2.RELEASE для Spring Boot и 5.0.6.RELEASE для Spring Core.)

Заранее спасибо!

Могу я увидеть одно из ваших запланированных выражений cron, которое останавливается?

Kartik 15.11.2018 02:21

Убедитесь, что ОС, в которой вы работаете, не убивает потоки, это может убить фактический поток планирования.

M. Deinum 15.11.2018 09:03

Аннотация @Scheduled не использует функцию cron. Это выглядит так: @Scheduled (initialDelay = 10000, fixedDelay = 60000).

Steven P. 15.11.2018 16:53

Я не уверен, как узнать, убивает ли моя ОС потоки, но я сбрасываю потоки Java сегодня до и после полуночи, чтобы увидеть, не пропадают ли некоторые из них. Я не думаю, что ОС это делает, потому что у меня есть несколько длительных потоков, не управляемых Spring, и они продолжают работать. К вашему сведению, я запускаю CentOS 7 внутри контейнера Docker. Хост - Debian 9.

Steven P. 15.11.2018 16:57
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
1 395
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я не уверен, что вы имеете в виду, говоря о прекращении бега.

Но первое, что вам нужно сделать, это запустить свои расписания в разных потоках и поместить их в очередь.

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

Если вы просто имеете в виду убить все остальные расписания в полночь, вам просто нужно начать свои полуночные расписания и убить других.

Прошу прощения за мой плохой английский, надеюсь, это может вам помочь.

Спасибо за ваш ответ. Я уже установил размер пула больше, чем количество запланированных задач в планировщике и исполнителе. Если я правильно понимаю, это означает, что они должны быть в разных потоках.

Steven P. 15.11.2018 17:15

Когда я сказал «Остановка», я имел в виду, что задачи полностью остановлены, насколько я могу судить. Вчера я оставил приложение включенным более чем на 8 часов после последнего выполнения, и никаких действий со стороны задач больше не было.

Steven P. 15.11.2018 17:17

Задачи не могут запускаться снова? Вы отключили пул потоков? Если пул потоков все еще работает, что, если вы выполните задачу с помощью планировщика, такого как ThreadPoolTaskScheduler?

AokoQin 16.11.2018 06:19
@Scheduled(fixedDelay = 1000)
 void scheduleFixedDelayTask() {
   System.out.println(
  "Fixed delay task - " + System.currentTimeMillis() / 
 1000);
  }

В этом случае продолжительность между концом последнего выполнения и началом следующего выполнения является фиксированной. Задача всегда ожидает завершения предыдущей.

Эту опцию следует использовать, когда необходимо, чтобы предыдущее выполнение было завершено перед повторным запуском.

Поэтому поддерживайте задержку таким образом, чтобы предыдущее выполнение было завершено.

Надеюсь, поможет.

Ответ принят как подходящий

Спасибо всем, кто ответил.

Как оказалось, со Spring это не было проблемой. Оказалось, что задачи остановлены из-за остановки журналов. На самом деле произошло то, что наши сценарии, отслеживающие журналы, были недостаточно умны, чтобы обрабатывать файлы журналов, которые отправляются в полночь (лицо ладони).

Привет, Стивен, не могли бы вы подробнее объяснить, как решается проблема. Я столкнулся с той же проблемой с моим весенним планировщиком с некоторого времени.

Manoj K Sardana 03.05.2019 09:26

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