Spring Batch - 成功完成重复的Job excecutions

时间:2016-12-14 15:46:06

标签: java spring synchronization

想象一个简单的Spring Batch作业,我们希望每天午夜运行。但是我们有一个由两个节点组成的集群。我们希望这个作业只运行一次 - 因此第一个启动的节点将完成该作业,第二个节点将跳过处理。

这应该很容易完成,因为Spring Batch在两个节点的同一数据库中保存它的状态。它通常有效,但不幸的是,有时两个节点同时执行作业并完成工作。然后我可以在数据库中看到重复的作业执行(相同的参数)。

我想我发现了它为什么会发生 - 只是在开始检查之前的作业执行者,如果数据库中已有作业实例,如果没有,则创建新行。但是,当两者同时检查数据库时,两者都发现没有任何内容,因此创建并运行相同的执行。

我们必须为两个节点配置相同的配置。

1 个答案:

答案 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();
    }
}