我使用这种模式每30秒执行一次cron Quartz触发器作业:
0/30 * * * * ?
使用这种模式,如果我的工作花费超过30秒来完成执行,下一个流程是否会被触发并与第一个流程重叠?
在某个地方,我已经读过你可以编写一个模式来在前一个过程完成后启动cron触发器n
秒,但找不到以这种方式编程我的工作的确切答案。
答案 0 :(得分:1)
您可能需要的是有状态的工作实施。您需要实现StatefulJob
界面而不是Job
在文档中说
如果某个工作是有状态的,并且触发器会尝试“触发”。当作业已经执行时,触发器将阻塞(等待)直到上一次执行完成。
您可以在此链接http://www.quartz-scheduler.org/documentation/quartz-1.x/tutorials/TutorialLesson03
找到有关它的更多详细信息答案 1 :(得分:1)
StatefulJob
可能是我需要的Job
,但根据this和this的答案,正确解决此问题的方法是:
在Quartz 2.0版中,不推荐使用StatefulJob。现在建议使用注释:
@DisallowConcurrentExecution
public class YourJob implements org.quartz.Job {
void execute(JobExecutionContext context) {/*implementation omitted*/}
}
说明:
@DisallowConcurrentExecution
:不允许多个作业实例同时运行(考虑一个作业在其execute()方法中有代码需要34秒才能运行的情况,但是它会被调度一个触发器每30秒重复一次。)