首页 > 解决方案 > Ktor-Kotlin 中的 Quartz 调度器运行在 Kubernetes 集群的所有 Pod 上

问题描述

我是 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 上启动

标签: kotlinquartz-schedulerguicektor

解决方案


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

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


推荐阅读