繁体   English   中英

在 Spring Batch 的 beforeStep 中停止作业

[英]Stopping a Job in the beforeStep in Spring Batch

我希望能够在达到时间阈值时停止工作。 我正在考虑两种方法。 首先是在 afterStep 中停止工作。 但是,如果它在最后一步完成时,我不希望它具有停止状态。 因此,我打算在 beforeStep 中停止它。

我尝试尝试

public void beforeStep(StepExecution stepExecution) {
    stepExecution.setStatus(BatchStatus.STOPPED);
    return;
}

public void beforeStep(StepExecution stepExecution) {
    stepExecution.setExitStatus(ExitStatus.STOPPED);
    return;
}

这些都没有奏效。 有什么建议?

在我的情况下,需要从 afterStep 停止工作。 所以我返回了 ExitStatus.Unknown 并从这样的工作中捕获:

step().on("UNKNOWN").end()

因此,工作没有错误地完成,我可以在需要时重新启动整个工作,没有“可重新启动”选项。

希望这可以帮到你。

上面代码的问题是停止了当前正在运行的步骤,而不是整个工作。

也许如果您在 job-current-step 配置中添加和调整以下代码将在步骤的 ExitStatus 为 STOPPED 时终止作业,并且再次运行时,作业将从下一步开始。
(取自这里

<step id="step1" parent="s1">
    <stop on="STOPPED" restart="step2"/>
</step> 


也可能有助于解决 ExitStatus/BatchStatus 之间的混淆。

关于计时阈值...据我所知,到目前为止,您计划测量当前步骤的时间(beforestep - afterstep),无论之前的步骤运行了多长时间。 要计算和前面的步骤,请尝试在 JobParameters 中添加时间戳并检查何时超过该阈值。

在这里看到这个问题,OP 在他的问题中有解决方案。

jobListener有点不同

@Override
public void beforeJob(JobExecution jobExecution) {
        JobParameters jobParameters = jobExecution.getJobParameters();
        
        //check params etc
        
        if (!shouldExecute) {
            jobExecution.stop();
            jobExecution.setExitStatus(new ExitStatus("STOPPED", "Invalid state."));
            return;
        }
}

您可以设置计时器(或类似的东西),并在收到时间限制通知时停止作业,如停止作业中所述。
如果您希望即使在最后一步广播时间警报也能正常完成作业,您可以检查(使用JobOperator )以查询作业进度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM