【问题标题】:Quartz Scheduler firing cron job on all nodes in clustered modeQuartz 调度程序在集群模式下的所有节点上触发 cron 作业
【发布时间】:2020-09-07 08:32:21
【问题描述】:

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

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

【问题讨论】:

  • 您的代码 sn-p 太小,无法提供帮助。请提供可重现的工作示例

标签: java cron cluster-computing quartz-scheduler


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    org.quartz.jobStore.isClustered = true

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      • 2010-11-04
      相关资源
      最近更新 更多