集群模式下的Quartz作业并发执行问题

时间:2019-10-02 11:50:06

标签: java spring spring-boot quartz

我们有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不能确定作业的执行是否挂在另一台机器上,应该重新启动它?”?

0 个答案:

没有答案