Если я вас правильно понимаю, вы хотите запустить несколько копий весеннего приложения (не имеет значения, управляется ли это docker, k8s, автономно и т. Д.).Затем вы хотите, чтобы фоновое задание было запущено только в одном экземпляре.Правильно?В этом случае я могу посоветовать вам взглянуть на ShedLock .
ShedLock делает одну-единственную вещь.Это гарантирует, что ваши запланированные задачи выполняются не более одного раза одновременно.Если задача выполняется на одном узле, она получает блокировку, которая предотвращает выполнение той же задачи с другого узла (или потока).Обратите внимание, что если одна задача уже выполняется на одном узле, выполнение на других узлах не ждет, она просто пропускается.
Она легко интегрируется в Spring.Например, запланированное пакетное задание может выглядеть следующим образом:
@Scheduled(cron = ...)
@SchedulerLock(name = "scheduledTaskName")
public void scheduledTask() {
// do something
}
Для реализации распределенной блокировки могут использоваться различные опции, например MySQL, Redis, Zookeeper и другие.