【问题标题】:Spring Batch Job Stop Using jobOperatorSpring Batch Job 停止使用 jobOperator
【发布时间】:2021-06-27 13:48:30
【问题描述】:

我已经使用 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 但批处理作业正在运行时

它的 web 应用程序,首先上传一些 CSV 文件并使用 Spring Batch 开始一些操作,在此执行期间如果用户需要停止然后停止来自另一个控制器方法的请求并尝试停止运行作业

请帮我停止运行工作

【问题讨论】:

  • 这是否意味着jobExplorer.findRunningJobExecutions("processJob")STOPPING 状态返回作业执行?您的作业是否在相同的 JVM 中运行?请分享有关您的设置的更多详细信息(作业启动器和作业操作员是否共享相同的数据源?)。
  • @MahmoudBenHassine 是的,它的 Web 应用程序,首先上传一些 csv 文件并使用 Spring Batch 开始一些操作,在此执行期间,如果用户需要停止然后停止来自另一个控制器方法的请求并尝试停止运行作业

标签: spring-batch spring-batch-job-monitoring


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    jobExplorer.findRunningJobExecutions 只返回正在运行的执行,所以如果在此之后的下一行你有一个处于STOPPING 状态的作业,这意味着在调用jobExplorer.findRunningJobExecutions 之后状态发生了变化。你需要知道这是可能的,你的控制器应该处理这种情况。

    【讨论】:

    • 但是当我得到这个异常时,我会为我的文件显示一些进程的执行。表示作业正在运行
    猜你喜欢
    • 1970-01-01
    • 2018-03-10
    • 2018-02-02
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多