首页 > 解决方案 > Quartz 调度程序在集群模式下的所有节点上触发 cron 作业

问题描述

我有一个使用 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()

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

标签: javacroncluster-computingquartz-scheduler

解决方案


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

来自文档:将 Job 类标记为不能同时执行多个 * 实例的注释(其中实例基于 JobDetail * 定义 - 或换句话说基于 JobKey)。


推荐阅读