当前位置: 首页 > 知识库问答 >
问题:

Quartz调度器在集群模式下的所有节点上触发cron作业

欧阳安晏
2023-03-14

我有一个应用程序,使用Quartz作为作业调度程序。有两种情况

    null

>

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

    当我根据场景1调度作业时,在作业执行时,只有一个应用程序执行作业。

    场景2,即每10秒执行一次的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()
    
    

    任何帮助或指导将非常感谢!

  • 共有1个答案

    庞意智
    2023-03-14

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

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

     类似资料:
    • 我在这里读到了以下关于石英簇模式的声明: 我假设“低频繁触发器”(每天一次)也会导致作业在随机节点上执行,因为有很多触发器“接近其执行时间”(高频繁触发器),所以从Quartz的角度来看,在下午01:00左右有很多触发器。

    • 我想知道是否有一个函数/方法来创建随机时间触发的作业。我的意思是,如果我设置一个cron计划在每周一上午10:00触发,并给出一个时间间隔,比方说30分钟,触发器将总是在9:30到10:30之间关闭。例如,这是cron调度表。

    • 我有一些用@NotConcurrent注释的作业,它们每个集群运行一次(即,只在一个节点中,只在一个线程中)。 现在我需要在集群的每个节点上运行一个作业。我删除了@NotConcurrent注释,但它只在一台机器上的每个线程上运行。它不会在其他节点上被激发。 我应该用什么来注释这份工作?

    • 问题内容: 我在集群环境中将Quartz Scheduler用作Spring bean。 我有一些用@NotConcurrent注释的作业,它们每个集群运行一次(即,仅在一个节点中,仅在一个线程中)。 现在,我需要在集群的每个节点上运行一项作业。我删除了@NotConcurrent批注,但是它仅在一台计算机上的每个线程上运行。它不会在其他节点上触发。 我应该用什么来注释作业? 示例:带注释的Job

    • 我有一个有两个节点的集群,它连接到同一个数据库,还有一个调度作业,由Quartz调度程序每10分钟启动一次。在quartz.properties中设置。 我感兴趣的是,调度程序是否会为同一节点发出作业,直到每隔10分钟可到达该节点为止,或者它使用某种算法来确定哪个节点将执行该作业。 我在文档(http://www.quartz-scheduler.org/documentation/quartz-

    • 我的Kubernetes设置: v1.16.2裸机 1主节点:用于Jenkins master+Docker注册表 5个从节点:用于Jenkins JNPL从节点 我使用kubernetes-plugin来运行奴隶码头代理。标记为“Jenkins=slave”的所有从k8节点。当我将nodeSelector(“Jenkins=slave”)用于podTemplate时,kubernetes总是在同