[英]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.