Комментарии 4
Наконец, мы аннотируем наши запланированные задания, применив аннотацию
@SchedulerLock
Насколько я понял, SchedulerLock -- это обычная распределенная блокировка. Поэтому запланированное задание все-равно выполнится сразу на всех узлах, но последовательно. Не знаю есть ли у SchedulerLock возможность отмены вызова метода, если он уже заблокирован, т.к. хотелось бы, чтобы задание не повторялось на каждом ноде.
Мне кажется что бы задание не выполнялось на остальных инстансах надо где-то на внешнем ресурсе держать признак блокировки
Из документации разработчика: https://github.com/lukas-krecan/ShedLock
ShedLock гарантирует, что ваши запланированные задачи выполняются не более одного раза в одно и то же время. Если задача выполняется на одном узле, она получает блокировку, которая предотвращает выполнение той же задачи на другом узле (или потоке). Обратите внимание, что, если одна задача уже выполняется на одном узле, выполнение на других узлах не дожидается ожидания, оно просто пропускается.
ShedLock не является распределенным планировщиком
Обратите внимание, что ShedLock не является и никогда не будет полноценным планировщиком, это просто блокировка. Если вам нужен распределенный планировщик, используйте другой проект. ShedLock разработан для использования в ситуациях, когда у вас есть запланированные задачи, которые не готовы к параллельному выполнению, но могут безопасно выполняться повторно. Более того, блокировки основаны на времени, и ShedLock предполагает, что часы на узлах синхронизированы.
Выполнение запланированных заданий в Spring Boot