我试图检查是否有任何正在运行的作业实例。
Set<JobExecution> jobExecutions = jobExplorer.findRunningJobExecutions(job.getName());
但是当我们有未正确完成的旧执行时,上面的代码不起作用。在这种情况下,jobExecutions 的大小大于 1。
我试图检查是否有任何正在运行的作业实例。
Set<JobExecution> jobExecutions = jobExplorer.findRunningJobExecutions(job.getName());
但是当我们有未正确完成的旧执行时,上面的代码不起作用。在这种情况下,jobExecutions 的大小大于 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";
因此,正如您在上面的查询中看到的,只有一个条件 -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
方法。