У меня есть приложение, которое каждые 15 минут выполняет репликацию из удаленной базы данных. Он просто синхронизирует два хранилища. Как только эта репликация будет запущена, это невозможно сделать снова. Я настроил следующую структуру, но я не уверен, что это правильный подход.
public class ReplicatorRunner {
private static Lock lock = new ReentrantLock();
public replicate() {
if (lock.tryLock()) {
try {
// long running process
} catch (Exception e) {
} finally {
lock.unlock();
}
} else {
throw new IllegalStateException("already replicating");
}
}
}
public class ReplicatorRunnerInvocator {
public void someMethod() {
try {
ReplicatorRunner replicator = new ReplicatorRunner();
replicator.replicate();
} catch (IllegalStateException e) {
e.printStackTrace();
}
}
}
ReplicatorRunner
- это класс, которому принадлежит метод replicate
, который можно запускать только по одному за раз.
Edit.
Мне нужно, чтобы следующий вызов потерпел неудачу ( не блокируется ), если метод уже запущен на любом экземпляре.