想象一个简单的Spring Batch作业,我们希望每天午夜运行。但是我们有一个由两个节点组成的集群。我们希望这个作业只运行一次 - 因此第一个启动的节点将完成该作业,第二个节点将跳过处理。
这应该很容易完成,因为Spring Batch在两个节点的同一数据库中保存它的状态。它通常有效,但不幸的是,有时两个节点同时执行作业并完成工作。然后我可以在数据库中看到重复的作业执行(相同的参数)。
我想我发现了它为什么会发生 - 只是在开始检查之前的作业执行者,如果数据库中已有作业实例,如果没有,则创建新行。但是,当两者同时检查数据库时,两者都发现没有任何内容,因此创建并运行相同的执行。
我们必须为两个节点配置相同的配置。
答案 0 :(得分:0)
解决此问题的最简单方法是使您的读者和作者同步。如果无法更改Reader / Writer的代码,则实现用于同步的包装器
public class SynchronizedItemReader<T> implements ItemReader<T>
{
private ItemReader<T> delegate;
public void setDelegate(ItemReader<T> delegate) {
this.delegate = delegate
}
public synchronized T read() {
return delegate.read();
}
}