0

我已经开始使用我的工作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批处理开始一些操作,在此执行期间如果用户需要停止然后停止来自另一个控制器方法的请求并尝试停止运行作业

请帮我停止运行工作

4

2 回答 2

0

当您告诉 spring batch 停止作业时,它会进入 STOPPING 模式。这意味着它将尝试完成当前正在处理的工作单元块,然后停止工作。可能发生的情况是您正在处理一项未完成工作单元的长时间运行的任务(它是否挂起?),因此它无法从 STOPPING 移动到 STOPPED。

正确执行两次会导致异常,因为您的工作在您第一次执行时已经停止。

于 2021-04-09T02:37:06.930 回答
0

如果您在作业运行时停止作业(通常处于某种STARTED状态),则不应出现此异常。如果您有此异常,则表示您在当前停止工作时已停止工作(这就是STOPPING状态的含义)。

jobExplorer.findRunningJobExecutions仅返回正在运行的执行,因此如果在此之后的下一行中您有一个处于STOPPING状态的作业,这意味着在调用jobExplorer.findRunningJobExecutions. 您需要知道这是可能的,并且您的控制器应该处理这种情况。

于 2021-04-02T13:13:22.197 回答