Ktor-Kotlin 中的 Quartz 调度器运行在 Kubernetes 集群的所有 Pod 上

Posted

技术标签:

【中文标题】Ktor-Kotlin 中的 Quartz 调度器运行在 Kubernetes 集群的所有 Pod 上【英文标题】:Quartz Scheduler in Ktor-Kotlin runs on all the pods of Kubernetes cluster 【发布时间】:2021-12-25 23:40:57 【问题描述】:

我是 Quartz 的新手,我在 KTOR 应用程序中使用 Quartz 2.3.2。 此应用程序将使用 Kubernetes 部署在集群中运行。

我的要求是只在这个 kubernetes 框架的一个实例/pod 中运行调度程序

我使用下面的代码在 kubernetes 集群中运行quartz

但下面的代码运行在 Kubernetes 集群的所有 Pod 上。如何只在一个实例上运行?

object SchedulerMain 
    
        fun schedulerTest(config: DBConfig) 
    
            DBConnectionManager.getInstance().addConnectionProvider(
                "myDs",
                HikariCpPoolingConnectionProvider(
                    "org.postgresql.Driver",
                    config.readerUrl.toString(),
                    config.username,
                    config.password,
                    10,
                    "SELECT * FROM table;"
                )
            )
            val schedFact: DirectSchedulerFactory = DirectSchedulerFactory.getInstance()
    try 
        val jobStore = JobStoreTX()
        jobStore.setIsClustered(true)
        jobStore.clusterCheckinInterval = 20000
        jobStore.tablePrefix = "schema.qrtz_"
        jobStore.misfireThreshold = 60000
        jobStore.driverDelegateClass = "org.quartz.impl.jdbcjobstore.PostgreSQLDelegate"
        jobStore.dataSource = "myDs"
        val simpleThreadPool = SimpleThreadPool()
        simpleThreadPool.threadCount = 5
        schedFact.createScheduler(
            "TestScheduler", "AUTO", simpleThreadPool, jobStore
        )
        val sched: Scheduler = schedFact.getScheduler("TestScheduler");
        val jobA: JobDetail =
            JobBuilder.newJob(JobA::class.java).withIdentity("jobA", "group2").storeDurably()
                .build()

        val triggerA: Trigger =
            TriggerBuilder.newTrigger().withIdentity("triggerA", "group2").startNow()
                .withPriority(15).withSchedule(
                    SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(40)
                        .repeatForever()
                ).build()

        if (!sched.checkExists(jobA.key)) 
            sched.scheduleJob(jobA, triggerA);
        
        sched.start()

     catch (e: SchedulerException) 
        e.printStackTrace()
    

AUTO 是字符串吗? 吊舱 1

Pod 1 和 2 都有相同的日志

更新: 我截断了所有石英表并启动了 kubernetes 集群,然后它按预期在单个实例上运行。 然后我停止了 Kubernnetes 集群并重新启动而不截断表,调度程序在所有 pod 上启动

【问题讨论】:

【参考方案1】:

Quartz 在集群模式下以某种方式运行,即所有工作在节点之间平衡以分配负载。 为什么您希望调度程序只在集群的一个节点上工作?

如果您希望您的作业非并发执行,请在您的作业类上使用@DisallowConcurrentExecution

【讨论】:

以上是关于Ktor-Kotlin 中的 Quartz 调度器运行在 Kubernetes 集群的所有 Pod 上的主要内容,如果未能解决你的问题,请参考以下文章

Quartz与Spring集成——创建调度器

Quartz3.0定时任务学习之异步调度器

任务调度器quartz的使用

Quartz定时调度jar包的执行Demo分享

Quartz与Spring集成——启动调度器

如何扩展 Quartz 调度器?