在开始工作之后,在之前的工作中 - 在某些情况下我们希望优雅地终止工作(即根本不运行工作但是没有抱怨,即例外)。当前执行此操作的方式类似于调用jobExecution.stop - 但是,这会导致JobInteruptedException进一步导致logger.error调用。
还有其他更好的程序化替代方案(没有人工干预)吗?
答案 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