Java Spring批处理检查正在运行的作业实例

Java Spring批处理检查正在运行的作业实例,java,spring,spring-batch,spring-batch-job-monitoring,Java,Spring,Spring Batch,Spring Batch Job Monitoring,我试图检查是否有任何正在运行的作业实例 Set<JobExecution> jobExecutions = jobExplorer.findRunningJobExecutions(job.getName()); Set jobExecutions=jobExplorer.findRunningJobExecutions(job.getName()); 但是当我们有旧的执行没有正确完成时,上面的代码就不起作用了。 在这种情况下,jobExecutions的大小大于1。我查看了Sp

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

Set<JobExecution> jobExecutions = jobExplorer.findRunningJobExecutions(job.getName());
Set jobExecutions=jobExplorer.findRunningJobExecutions(job.getName());
但是当我们有旧的执行没有正确完成时,上面的代码就不起作用了。
在这种情况下,jobExecutions的大小大于1。

我查看了Spring批处理代码,以查看此方法获取的执行情况&下面是我在源代码中找到的查询

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\u TIME为NULL
。因此,执行何时完成并不重要——它将为您提供所有未填充结束时间的执行

您只需根据您的业务需要对所需的执行进行Java过滤

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


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

嗯,在我看来,它在做它的工作。可能您应该实现JobExecutionListener,以查看作业是否已完成执行,例如Yes@Karim技术上您是正确的。但我不想考虑没有正确完成的那个。有没有更好的方法来管理它?@Arindam:我已经给出了一个答案&如果你能解释更多你所说的——没有正确完成的旧的执行,我可以调整它。