有没有办法将正在运行的弹簧批作业的生命周期限制为例如23个小时?
我们每天通过cron工作开始批处理工作,他的工作大约需要9个小时。在某些情况下,数据库连接速度太慢,以至于工作需要60多个小时才能完成。问题是下一个作业实例是第二天由cronjob启动的 - 然后是第二天的另一个 - 而另一个... ...
如果此作业未在例如23个小时,我想终止它并返回错误。有没有办法用弹簧批次开箱即用?
答案 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() {
// ...
}
}
这将优雅地停止作业,而不会强行终止任何正在运行的步骤。