У меня есть простая запланированная задача, созданная с помощью аннотации @Scheduled. Что-то вроде этого -
public void doSomething() {
// My code
}
У меня также есть сине-зеленый сценарий обновления, в котором это запланированное задание потенциально может выполняться как в синем, так и в зеленом кластерах. И учитывая, что эта запланированная задача изменяет БД, существует вероятность того, что один из узлов может перезаписать данные с другого узла - или в худшем случае в условиях гонки.
Я хочу приостановить все запланированные задачи на зеленом кластер, пока он не будет готов принимать трафик c. У меня уже есть код, подключенный к прослушиванию изменений состояния приложения.
Я изучил несколько вариантов -
- Просто добавив логическое значение в начале задачи.
- Добавление декоратора в ThreadPoolTaskScheduler.
Проблема с этими подходами заключается в том, что они пропускают задачу для этого конкретного расписания и не приостанавливают ее. Итак, если задача пропущена, скажем, в точке T, и приложение запускается немедленно, приложению придется ждать T + 30 минут, чтобы обновить sh данные.
Есть ли способ в springboot приостановить планировщики и возобновить немедленно?