【问题标题】:Spring batch restrict single instance of job across multiple serversSpring批处理限制跨多个服务器的单个作业实例
【发布时间】:2018-11-17 16:21:36
【问题描述】:

我有一个可能跨多个服务器运行的 Spring Batch 作业。我有一个监听器,可以防止在一台服务器上同时运行多个作业实例。但是,我想确保该作业不能同时在多个服务器上运行。

我已经搜索并没有找到解决此问题的方法

【问题讨论】:

  • 您是否在服务器之间共享同一个作业存储库数据存储?如果是这样,Spring Batch 不应让您同时启动多个 JobExecution(相同的作业名称和相同的参数)。话虽如此,您还可以使用 Spring Integration 中包含的分布式锁机制(我们在 Spring Cloud Task 中将其用于该用例)。
  • @MichaelMinella 我在服务器之间共享相同的作业存储库数据存储,除了我有一个作业增量计数作为参数,因此作业使用相同的名称但不同的参数运行。我一直在研究分布式锁机制,但似乎找不到关于它的好信息。我会继续寻找
  • 这是我们为 Spring Cloud Task 所做的。围绕批处理启动逻辑应用相同的机制将以相同的方式工作:github.com/spring-cloud/spring-cloud-task/blob/master/…
  • @MichaelMinella 非常感谢 - 我将尝试实现此功能

标签: java spring spring-boot spring-batch


【解决方案1】:

我实现了一个侦听器,用于检查与某个名称匹配的 spring 批处理控制表中正在运行的作业执行的数量。如果执行的大小超过 1,则当前作业的 jobExecution 将失败。代码如下:

@Component
public class SingleInstanceListener implements JobExecutionListener {
    @Autowired
    private JobExplorer explorer;

    @Override
    public void beforeJob(JobExecution jobExecution) {
        String jobName = jobExecution.getJobInstance().getJobName();
        Set<JobExecution> executions = explorer.findRunningJobExecutions(jobName);
        if(executions.size() > 1) {
            jobExecution.stop();
        }
    }

    @Override
    public void afterJob(JobExecution jobExecution) {

    }

}

【讨论】:

  • 值得注意的是,如果批处理持久化存储是数据库,那么在“未知”状态下的单次执行将阻止批处理再次执行。值得在时间限制内测试执行,或使用自定义清理代码来删除有毒的“未知”执行。
猜你喜欢
  • 1970-01-01
  • 2021-07-31
  • 2017-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-12
  • 2014-02-13
  • 1970-01-01
  • 2021-12-10
相关资源
最近更新 更多