在启动工作之后,在之前的工作中——在某些情况下,我们希望优雅地终止工作(即根本不运行工作,但既不抱怨,也不例外)。当前执行此操作的方法看起来像调用 jobExecution.stop - 但是,这会导致 JobInteruptedException 进一步导致 logger.error 调用。
还有其他更好的程序化替代方案(无需人工干预)吗?
在启动工作之后,在之前的工作中——在某些情况下,我们希望优雅地终止工作(即根本不运行工作,但既不抱怨,也不例外)。当前执行此操作的方法看起来像调用 jobExecution.stop - 但是,这会导致 JobInteruptedException 进一步导致 logger.error 调用。
还有其他更好的程序化替代方案(无需人工干预)吗?
您可以阅读:
只需根据条件为您的第一步引入一个结束元素:
'end' 元素指示 Job 以 COMPLETED 的 BatchStatus 停止。
我解决了在我的“作业前”侦听器中添加标志 boolean 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);
}
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"
停止。
不要调用stop()
作业执行,而是尝试通过JobOperator发出信号,如停止作业中所示