在Spring Batch中的beforeStep中停止作业

时间:2014-03-01 23:57:37

标签: java spring spring-batch

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

我尝试过试验

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

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

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

5 个答案:

答案 0 :(得分:1)

上述代码的问题是停止当前运行的步骤,而不是整个作业。

如果您在作业中添加并调整以下代码 - 当前步骤配置将终止当步骤的ExitStatus停止时再次运行时,作业将从下一步开始。
(取自here

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


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

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

答案 1 :(得分:1)

就我而言,需要从afterStep停止作业。所以我返回了ExitStatus.Unknown并开始工作,像这样:

step()。on(“未知”).end()

因此作业可以顺利完成,并且可以在需要时重新启动整个作业,而无需使用“可重新启动”选项。

希望这可以为您提供帮助。

答案 2 :(得分:0)

我建议查看CompletionPolicies,尤其是TimeoutTerminationPolicy

答案 3 :(得分:0)

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

答案 4 :(得分:0)

看到正确的问题here,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;
        }
}