集群模式下所有节点上的Quartz Scheduler触发cron作业

时间:2020-05-20 20:18:26

标签: java cron cluster-computing quartz-scheduler

我有一个使用Quartz作为作业计划程序的应用程序。有两种情况

  1. 安排将来要执行的工作。
  2. 每10秒运行一次的cron作业。

我运行了我的应用程序的两个实例。两者都设置为集群模式,并且都将instanceId设置为“ AUTO”。

这些是我的观察结果

  1. 应用程序的两个实例都将启动并连接到数据库。两者都报告它们已成功群集并连接到数据库。

  2. 当我根据场景1安排作业时,在执行作业时,只有一个应用程序执行该作业。

  3. 方案2,即每10秒执行一次的cron作业,同时由两个应用程序执行。

  4. 我查看数据库中的qrtz表。 cron作业只有一个作业和一个触发器。

  5. 我还在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()

任何帮助或指导将不胜感激!

2 个答案:

答案 0 :(得分:0)

我认为您可以在作业类上使用@DisallowConcurrentExecution批注。

从文档中: 一种将Job类标记为不能包含多个的注释 *并发执行的实例(其中实例基于JobDetail *定义-换句话说,就是基于JobKey。

答案 1 :(得分:-1)

org.quartz.jobStore.isClustered = true

确保在选择触发器之前将适当的行锁应用于触发器,如果​​该属性为false,则两个实例都可以选择一个触发器。

http://www.quartz-scheduler.org/documentation/quartz-1.8.6/configuration/ConfigJDBCJobStoreClustering.html

相关问题