我们有3个Quartz调度程序实例,它们在具有通用数据库的不同机器上运行。有很多工作,每个工作类别都用@DisallowConcurrentExecution
注释。我们有一个问题-有时有两个作业(一个作业类别的实例)同时运行,但不应同时运行。
实例在Spring引导下运行,并且间隔设置为@Cron
,并且在bean上使用了注释。作业可能工作1-2个小时,两次调用之间的间隔也约为1-2个小时,因此很有可能在之前的实例完成之前调用新的作业实例。有时会发生:在另一个调度程序上启动了一个新的作业实例,而在不同调度程序上的先前作业实例尚未完成。
我无法重现此问题,我在使用相同石英配置的2个应用程序实例与测试数据库一起运行的计算机上进行了尝试,并且该工作需要1个小时才能完成,并且将调用间隔设置为10秒,一切正常。仅在将Quartz属性isClustered
设置为false
时,我设法重现了该问题。
我们的工作配置:
@Bean
@CronTrigger(
cronExpression = "0 0 0/2 ? * *",
description = "Update category stats from indexer"
)
public UpdateStatsJob updateStatsJob(){
return new UpdateStatsJob(...);
}
我们的石英特性:
# main
org.quartz.scheduler.instanceName=QuartzScheduler
org.quartz.scheduler.instanceId=AUTO
org.quartz.scheduler.skipUpdateCheck=true
# storage
org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
org.quartz.jobStore.dataSource=abc
org.quartz.jobStore.tablePrefix=abc.qrtz_
org.quartz.jobStore.useProperties=true
org.quartz.jobStore.isClustered=true
# jdbc
org.quartz.dataSource.abc.driver=${project.db.driver.class.name}
....
# threads
org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount=10
org.quartz.threadPool.threadNamePrefix=ProjectJobThread
同时执行这些作业会导致竞速情况,使作业崩溃。
是否存在任何可能产生此行为的设置或属性?
也许这取决于“如果Quartz不能确定作业的执行是否挂在另一台机器上,应该重新启动它?”?