问题描述
我已经使用 jobLauncher.run(processJob,jobParameters);
开始了我的工作,当我尝试使用另一个请求 jobOperator.stop(jobExecution.getId());
停止工作时,然后获得豁免:
org.springframework.batch.core.launch.JobExecutionNotRunningException: JobExecution 必须正在运行才能停止
Set<JobExecution> jobExecutionsSet= jobExplorer.findRunningJobExecutions("processJob");
for (JobExecution jobExecution:jobExecutionsSet) {
System.err.println("job status : "+ jobExecution.getStatus());
if (jobExecution.getStatus()== BatchStatus.STARTED|| jobExecution.getStatus()== BatchStatus.STARTING || jobExecution.getStatus()== BatchStatus.STOPPING){
jobOperator.stop(jobExecution.getId());
System.out.println("###########Stopped#########");
}
}
当打印作业状态始终为 job status : STOPPING
但批处理作业正在运行时
它的网络应用程序,首先上传一些 CSV 文件并使用 spring 批处理开始一些操作,在此执行期间如果用户需要停止然后停止来自另一个控制器方法的请求并尝试停止运行作业
请帮助我停止运行作业
解决方法
如果您在作业运行时停止作业(通常处于 STARTED
状态),您不应收到此异常。如果您有此异常,则表示您已停止当前正在停止的作业(这就是 STOPPING
状态的含义)。
jobExplorer.findRunningJobExecutions
仅返回正在运行的执行,因此如果在此行之后的下一行您有一个处于 STOPPING
状态的作业,这意味着在调用 jobExplorer.findRunningJobExecutions
后状态立即更改。您需要知道这是可能的,您的控制器应该处理这种情况。
当您告诉 spring batch 停止作业时,它会进入停止模式。这意味着它将尝试完成当前正在处理的工作单元块,但随后停止工作。可能发生的情况是您正在处理一个长时间运行的任务,该任务没有完成一个工作单元(是否挂起?),因此它无法从 STOPPING 移动到 STOPPED。
正确执行两次会导致异常,因为在您第一次执行时,您的工作已经停止。