Сбой блокировки Java Spring shedlock

#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 туда компонент, все работает как шарм