Вот упрощенный подход c.
Поскольку у вас есть два запланированных метода в двух виртуальных машинах, запущенных одновременно, добавьте случайную задержку к обеим. В этом ответе есть много вариантов, как отложить запуск на случайную длительность. Spring @ Запланированная случайная задержка аннотации
Внутри метода запускайте задание, только если оно НЕ запущено (другой ВМ). Это можно сделать с помощью новой таблицы для отслеживания этого.
Вот псевдокод для этой схемы:
@Scheduled(cron = "schedule expression")
public void batchUpdateMethod() {
//Check database for signs of job running now.
if (job is not running){
//update database table to indicate job is running
//Run the batch job
//update database table to indicate job is finished
}
}
База данных или какое-либо общее расположение файла должно использоваться в качестве синхронизировать c между двумя запусками, поскольку две виртуальные машины не зависят друг от друга.
Для более надежной конструкции рассмотрим Spring Batch Spring Batch использует базу данных для своих заданий (JobsRepository). По умолчанию источник данных в памяти используется для отслеживания запущенных заданий и их состояния. В вашей настройке 2 экземпляра (скорее всего) используют свои собственные в базе данных памяти. Несколько экземпляров Spring Batch могут координироваться друг с другом как кластер, и один может запускать задания, а другой - создавать резервные копии actasa, если база данных jobsRepository является общей. Для этого вам нужно настроить 2 экземпляра на использование общего источника данных.
Вот несколько документов: https://docs.spring.io/spring-batch/docs/current/reference/html/index-single.html#jobrepository
https://docs.spring.io/spring-batch/docs/current/reference/html/job.html#configuringJobRepository