确保 Spring Quartz 作业执行不会重叠
2022-08-31 21:06:04
我有一个Java程序,每20秒从Spring Qquartz执行一次。有时它只需要几秒钟来执行,但随着数据变大,我确信它会运行20秒或更长时间。
如何防止 Quartz 在一个实例仍在执行时触发/触发作业?在数据库上执行相同操作时触发 2 个作业不会很好。有没有办法进行某种同步?
我有一个Java程序,每20秒从Spring Qquartz执行一次。有时它只需要几秒钟来执行,但随着数据变大,我确信它会运行20秒或更长时间。
如何防止 Quartz 在一个实例仍在执行时触发/触发作业?在数据库上执行相同操作时触发 2 个作业不会很好。有没有办法进行某种同步?
如果您将类更改为实现StatefulJob而不是Job,Quartz将为您处理此事。来自 StatefulJob javadoc:
有状态作业不允许并发执行,这意味着在 execute(xx) 方法完成之前出现的新触发器将被延迟。
StatefulJob 扩展了 Job,并且不添加任何新方法,因此要获得所需的行为,您需要做的就是更改以下内容:
public class YourJob implements org.quartz.Job {
void execute(JobExecutionContext context) {/*implementation omitted*/}
}
对此:
public class YourJob implements org.quartz.StatefulJob {
void execute(JobExecutionContext context) {/*implementation omitted*/}
}
在 Quartz 的 2.0 版中,已弃用。现在建议改用注释,例如StatefulJob
@DisallowConcurrentExecution
public class YourJob implements org.quartz.Job {
void execute(JobExecutionContext context) {/*implementation omitted*/}
}