#java #spring-boot #scheduled-tasks #shedlock
#java #весенняя загрузка #запланированные задачи #блокировка
Вопрос:
у меня есть приложение с весенней загрузкой, которое в производственной среде запускается в 2 экземплярах, в результате чего запланированные задачи выполняются дважды. чтобы избежать этого, я пытаюсь использовать shedlock, как описано здесь и здесь, но это не влияет. я уже использую базу данных MySQL, к которой я добавил shedlock
таблицу, как описано в обоих приведенных выше примерах.
структура моего проекта выглядит следующим образом (частично) —
в моем application.properties
файле у меня есть следующие настройки —
db.driver=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/b4ad?autoReconnect=trueamp;useSSL=falseamp;useUnicode=trueamp;useJDBCCompliantTimezoneShift=trueamp;useLegacyDatetimeCode=falseamp;serverTimezone=UTC
db.username=*****
db.password=*****
к AppConfig
классу я добавил эту аннотацию —
@EnableSchedulerLock(defaultLockAtMostFor = "PT30S")
и этот компонент —
@Bean
public LockProvider lockProvider(DataSource dataSource) {
return new JdbcTemplateLockProvider(dataSource, "b4ad.shedlock");
}
и в ScheduledManager
классе у меня есть эта запланированная задача —
@Scheduled(cron = "0 0/1 * * * ?")
@SchedulerLock(name = "deactivateExpiredOrganizations", lockAtLeastFor = "PT5M")
public void deactivateExpiredOrganizations() {
// my code...
}
когда я запускаю свое приложение локально в 2 экземплярах (используя 2 разных порта в application.properties
файле), просматривая журнал, я вижу, что задача выполняется в обоих экземплярах, и в то же время shedlock
таблица остается пустой.
согласно второму пункту в разделе «Устранение неполадок«, кажется, что я что-то пропустил-настроил, но я не могу сказать, что.
любая помощь будет оценена.
Комментарии:
1. Мы создаем таблицу ScheduledTask и создаем столбец типа Bit с именем started. Проверьте его значение в начале вашей задачи. Установите его равным 1, когда задача начнет выполняться. И если это уже 1, не запускайте свою задачу. Установите его снова на 0 после завершения вашей задачи!
Ответ №1:
ну, по-видимому, в моем большом проекте был еще один класс конфигурации (помимо AppConfig
) — вызываемый SqlSpringConfig
внутри модуля db. как только я помещаю LockProvider
туда компонент, все работает как шарм