春季批次|在工作中优雅的工作终止

时间:2012-09-27 10:59:13

标签: jobs spring-batch

在开始工作之后,在之前的工作中 - 在某些情况下我们希望优雅地终止工作(即根本不运行工作但是没有抱怨,即例外)。当前执行此操作的方式类似于调用jobExecution.stop - 但是,这会导致JobInteruptedException进一步导致logger.error调用。

还有其他更好的程序化替代方案(没有人工干预)吗?

4 个答案:

答案 0 :(得分:2)

您可以阅读:

根据条件为您的第一步引入结束元素:

  

'end'元素指示Job停止使用BatchStatus   已完成。

答案 1 :(得分:0)

仅当事务提交成功时,

stop()指令才会处于活动状态。 如果你所有的大块回滚你的工作都不会停止。

我已经解决了这个问题: 创建一个ChunkListener并在方法afterChunkError(ChunkContext chunkCtx)中放置:

StepExecution stepExecution = chunkCtx.getStepContext().getStepExecution();
JobExecution jobExecution = jobExplorer.getJobExecution(stepExecution.getJobExecutionId());

if (jobExecution.getStatus().equals(BatchStatus.STOPPING)) {
    stepExecution.setTerminateOnly();
}

这会强制"controlled"停止。

答案 2 :(得分:0)

我解决了在我的“before job”监听器中添加标志布尔 executeTheJob 的问题,当我不想执行该作业时,我将其设置为false。

然后我使用此配置在 firstStep 中处理:

<step id="firstStep" >
    <tasklet ref="myFirstTasklet"/>
    <stop on="STOPPED" restart="firstStep" />
    <next on="COMPLETED" to="nextStep"/>
</step>

在我的第一个tasklet的开头,我有这个:

if (executeTheJob == false) {
    contribution.setExitStatus(ExitStatus.STOPPED);
}

答案 3 :(得分:-1)

不要在作业执行时调用stop(),而是尝试通过JobOperator发信号,如Stopping a Job

所示