1

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

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

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

4

1 回答 1

2

我查看了 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";

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

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

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

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

于 2019-11-27T10:32:18.097 回答