我有一个应用程序,每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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
的ReplicatorRunner是类拥有该方法replicate只能运行一次一个.
编辑.如果方法已在任何实例上运行,我需要下一次调用失败(不阻止).
这看起来不错。ReentrantLock.tryLock() 只会将锁授予一个线程,因此synchronized不是必需的。它还可以防止您所说的同步中固有的阻塞。ReentrantLock 是可序列化的,因此应该可以跨集群工作。
大胆试试吧。
| 归档时间: |
|
| 查看次数: |
5068 次 |
| 最近记录: |