interface LockService {
bool aquireLock(String lockKey, String value);
bool releaseLock(String lockKey);
}
interface SomeService {
void do();
}
class Scheduler{
@AutoWired LockService lockService;
@Autowired SomeService someService;
@Scheduled(fixedRate = 10000)
public void awesomeJob() throws InterruptedException {
if(lockService.aquireLock("awesomeJob", serverId) ){
try{
//call service method
someService.do();
}catch( Exception e ){
//TODO
}finally{
lockService.releaseLock("awesomeJob");
}
}
}
}
Вы можете иметь блокировку, подобную этому примеру, реализовать интерфейс блокировки, который будет обеспечивать блокировку для данной службы. Если у вас есть LockService, используйте его, чтобы ограничить запуск функции.
Единственная проблема в том, что вам нужно добавить этот блок кода ко всем функциям. Если вы не хотите добавлять этот блок кода ко всем функциям, добавьте обработчик AOP на основе аннотаций.
Кроме того, что делать, если сервер, получивший блокировку, умирает? Нам нужно установить максимальное время истечения каждой блокировки или использовать время в значении блокировки, чтобы определить, когда она была добавлена, на основе времени блокировки и принять решение, возможно ли это запустить или нет.