【问题标题】:Spring batch check running Job InstanceSpring批量检查运行Job Instance
【发布时间】:2019-11-22 12:22:58
【问题描述】:

我试图检查是否有任何正在运行的作业实例。

Set<JobExecution> jobExecutions = jobExplorer.findRunningJobExecutions(job.getName());

但是,当我们有未正确完成的旧执行时,上面的代码不起作用。 在这种情况下,jobExecutions 的大小大于 1。

【问题讨论】:

  • 嗯,在我看来,它正在发挥作用。例如,您可能应该实现 JobExecutionListener 以查看作业是否已完成执行
  • 是的@Karim 从技术上讲你是正确的。但我不想考虑没有正确完成的那个。有没有更好的管理方法?
  • @Arindam:我已经提供了一个答案并可以对其进行调整,只要您解释一下您的意思 - 未正确完成的旧执行

标签: java spring spring-batch spring-batch-job-monitoring


【解决方案1】:

我查看了 Spring Batch 代码以查看此方法正在获取哪些执行 & 下面是我在源代码中找到的查询。

private static final String GET_RUNNING_EXECUTIONS = "SELECT E.JOB_EXECUTION_ID, E.START_TIME, E.END_TIME, E.STATUS, E.EXIT_CODE, E.EXIT_MESSAGE, E.CREATE_TIME, E.LAST_UPDATED, E.VERSION, "
            + "E.JOB_INSTANCE_ID, E.JOB_CONFIGURATION_LOCATION from %PREFIX%JOB_EXECUTION E, %PREFIX%JOB_INSTANCE I where E.JOB_INSTANCE_ID=I.JOB_INSTANCE_ID and I.JOB_NAME=? and E.END_TIME is NULL order by E.JOB_EXECUTION_ID desc";

所以正如您在上面的查询中看到的,只有一个条件 - 来自 Job Execution 表的 END_TIME is NULL。因此,执行何时完成并不重要 - 它会为您提供未填充 END_TIME 的所有执行。

您可以根据业务需要简单地对所需执行进行 Java 过滤,例如,

Set&lt;JobExecution&gt; runningJobExecutions = jobExecutions.stream().filter(jobExecution-&gt;ExitStatus.COMPLETED.equals(jobExecution.getExitStatus())).collect(Collectors.toSet());

您可以根据需要修改filter 方法。

【讨论】:

    猜你喜欢
    • 2021-04-11
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多