我希望能够在满足时间阈值时停止工作。我正在考虑两种方法。首先是在afterStep中停止工作。但是,如果它在最后一步完成,我不希望它具有Stopped状态。因此,我将在beforeStep中停止它。
我尝试过试验
public void beforeStep(StepExecution stepExecution) {
stepExecution.setStatus(BatchStatus.STOPPED);
return;
}
和
public void beforeStep(StepExecution stepExecution) {
stepExecution.setExitStatus(ExitStatus.STOPPED);
return;
}
这些都没有奏效。有什么建议吗?
答案 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)
答案 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;
}
}