我有一个使用Quartz作为作业计划程序的应用程序。有两种情况
我运行了我的应用程序的两个实例。两者都设置为集群模式,并且都将instanceId设置为“ AUTO”。
这些是我的观察结果
应用程序的两个实例都将启动并连接到数据库。两者都报告它们已成功群集并连接到数据库。
当我根据场景1安排作业时,在执行作业时,只有一个应用程序执行该作业。
方案2,即每10秒执行一次的cron作业,同时由两个应用程序执行。
我查看数据库中的qrtz表。 cron作业只有一个作业和一个触发器。
我还在qrtz db的“预定状态”表中观察到,该应用程序的两个实例都在不断签入。
这是我设置cron作业的方式:
val myCronJob = newJob(MyCronJob::class.java)
.withIdentity("cronjob", "cronJobGroup")
.build()
val trigger = newTrigger()
.withIdentity("cronjob", "cronJobGroup")
.startNow()
.withSchedule(simpleSchedule()
.withMisfireHandlingInstructionIgnoreMisfires()
.withIntervalInSeconds(10)
.repeatForever())
.build()
任何帮助或指导将不胜感激!
答案 0 :(得分:0)
我认为您可以在作业类上使用@DisallowConcurrentExecution批注。
从文档中: 一种将Job类标记为不能包含多个的注释 *并发执行的实例(其中实例基于JobDetail *定义-换句话说,就是基于JobKey。
答案 1 :(得分:-1)
org.quartz.jobStore.isClustered = true
确保在选择触发器之前将适当的行锁应用于触发器,如果该属性为false,则两个实例都可以选择一个触发器。