5

在启动工作之后,在之前的工作中——在某些情况下,我们希望优雅地终止工作(即根本不运行工作,但既不抱怨,也不例外)。当前执行此操作的方法看起来像调用 jobExecution.stop - 但是,这会导致 JobInteruptedException 进一步导致 logger.error 调用。

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

4

4 回答 4

3

您可以阅读:

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

'end' 元素指示 Job 以 COMPLETED 的 BatchStatus 停止。

于 2012-09-27T13:54:16.523 回答
1

我解决了在我的“作业前”侦听器中添加标志 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);
}
于 2018-05-16T12:00:15.767 回答
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"停止。

于 2017-09-01T10:12:03.300 回答
-1

不要调用stop()作业执行,而是尝试通过JobOperator发出信号,如停止作业中所示

于 2012-10-15T22:44:58.393 回答