限制批处理作业的生命周期

时间:2014-11-21 08:53:05

标签: spring batch-processing spring-batch

有没有办法将正在运行的弹簧批作业的生命周期限制为例如23个小时?

我们每天通过cron工作开始批处理工作,他的工作大约需要9个小时。在某些情况下,数据库连接速度太慢,以至于工作需要60多个小时才能完成。问题是下一个作业实例是第二天由cronjob启动的 - 然后是第二天的另一个 - 而另一个... ...

如果此作业未在例如23个小时,我想终止它并返回错误。有没有办法用弹簧批次开箱即用?

3 个答案:

答案 0 :(得分:1)

如果您编写自己的作业类来启动该过程,则可以使您的类实现StatefulJob接口,从而防止同时启动同一作业。除此之外,您可以编写自己的监控并在一段时间后以编程方式停止工作,但它需要一些自定义编码,我不知道是否有任何内置用于此类用例。

答案 1 :(得分:1)

Spring Batch专门避免了作业编排的问题。话虽这么说,你可以为你的工作添加一个监听器来检查运行的其他实例,并在开始之前调用stop。不知道每项工作的作用,我不确定它会有多么有效,但它应该是一个开始。

答案 2 :(得分:0)

使用 StepListener,您可以通过调用 StepExecution#setTerminateOnly 来停止作业。

stepBuilderFactory
...
.writer(writer)
.listener(timeoutListener)
...
.build()

TimeoutListener 可能看起来像这样

@Component
public class TimeoutListener implements StepListener {

    private StepExecution stepExecution;

    @BeforeStep
    public void beforeStep(StepExecution stepExecution) {
        this.stepExecution = stepExecution;
    }

    @BeforeRead
    public void beforeRead() {
        if (jobShouldStop()) {
            stepExecution.setTerminateOnly();
        }
    }

    private boolean jobShouldStop() {
        // ...
    }
}

这将优雅地停止作业,而不会强行终止任何正在运行的步骤。