Spring Batch 作业停止使用 jobOperator

问题描述

我已经使用 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。

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...