Quartz Cluster恢复机制

时间:2019-02-27 07:34:32

标签: quartz-scheduler

我运行一个带有弹簧的简单控制器来测试石英的功能。

@PostMapping(path = ["/api/v1/start/{jobKey}/{jobGroup}"])
fun start(@PathVariable jobKey: String, @PathVariable jobGroup: String): ResponseEntity<String> {

    val simpleJob = JobBuilder
        .newJob(SampleJob::class.java)
        .requestRecovery(true)
        .withIdentity(JobKey.jobKey(jobKey, jobGroup))
        .build()

    val sampleTrigger = TriggerBuilder
        .newTrigger()
        .withIdentity(jobKey, jobGroup)
        .withSchedule(
            SimpleScheduleBuilder
                .repeatSecondlyForever(5)
                .withMisfireHandlingInstructionIgnoreMisfires())
        .build()

    val scheduler = factory.scheduler

    scheduler.jobGroupNames.contains(jobGroup)
    if (scheduler.jobGroupNames.contains(jobGroup)) {
        return ResponseEntity.ok("Scheduler exists.")
    }

    scheduler.scheduleJob(simpleJob, sampleTrigger)
    scheduler.start()

    return ResponseEntity.ok("Scheduler started.")
}

@PostMapping(path = ["/api/v1/stop/{jobKey}/{jobGroup}"])
fun stop(@PathVariable jobKey: String, @PathVariable jobGroup: String): String {

    val scheduler = factory.scheduler
    scheduler.interrupt(JobKey.jobKey(jobKey, jobGroup))

    val jobGroupNames = scheduler.jobGroupNames
    logger.info("Existing jobGroup names: {}", jobGroupNames)

    return scheduler.deleteJob(JobKey.jobKey(jobKey, jobGroup)).toString()
}

然后,我使用相同的代码在不同的端口上启动两个应用程序,并开始使用它。我们称它们为APP1和APP2 我使用PostgreSQL作为JobStore。

所以我运行几种情况。

1)在APP1中使用group1和key1创建作业

2)尝试在APP2中使用group1和key1创建作业。 -它给出了作业已经开始的错误。行为就像我预期的那样。

3)停止APP1。我希望该作业将在APP2中执行,因为它仍存在于JobStore中,但事实并非如此。我是否需要提供一些其他配置?

4)启动APP1,也没有任何反应。此外,group1和key1的记录仍在DB中显示,无法启动。

我是否需要修改关机行为以在应用程序关机时删除作业并在另一个应用程序中启动作业?还是我只需要以其他正确的方式配置触发器?

1 个答案:

答案 0 :(得分:0)

我不好,那是一个愚蠢的问题。我忘了在应用程序中启动sheduler

@Bean
open fun schedulerFactory(): SchedulerFactory {
    val factory = StdSchedulerFactory()
    factory.initialize(ClassPathResource("quartz.properties").inputStream)
    factory.scheduler.start() // this line was missed
    return factory
}