Как заставить Quartz работать последовательно в режиме кластера

#spring-boot #quartz-scheduler

Вопрос:

Я использую Quartz с Spring Boot для одной из служб, и, несмотря на кластеризованную конфигурацию и использование аннотации @DisallowConcurrentExecution, я наблюдаю, что задание запускается несколько раз.

Забавно, что это происходит только после перезапуска сервиса. После пары запусков задание «настраивается»в правильный режим выполнения.

Моя конфигурация

 spring:
  quartz:
    properties:
      org.quartz.jobStore:
        class: org.quartz.impl.jdbcjobstore.JobStoreTX
        driverDelegateClass: org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
        isClustered: true
        clusterCheckinInterval: 500
        acquireTriggersWithinLock: true
        tablePrefix: qtz_
      org.quartz.scheduler:
        instanceName: CompanyProfileScheduler
        instanceId: AUTO
    job-store-type: jdbc
    jdbc:
      initialize-schema: never
 

Моя работа связана с

 @Configuration
public class QuartzConfig {

    @Bean
    public JobDetail companyProfilePublishingSchedulerJobDetails() {
        return JobBuilder
                .newJob(CompanyProfilePublishingJob.class)
                .withIdentity("CompanyProfilePublishingScheduler")
                .storeDurably()
                .build();
    }

    @Bean
    public Trigger companyProfilePublishingTrigger(final JobDetail companyProfilePublishingSchedulerJobDetails) {
        return TriggerBuilder
                .newTrigger()
                .forJob(companyProfilePublishingSchedulerJobDetails)
                .withIdentity("CompanyProfilePublishingSchedulerTrigger")
                .withSchedule(
                        SimpleScheduleBuilder
                                .simpleSchedule()
                                .withIntervalInSeconds(CompanyProfilePublishingJob.RUN_INTERVAL_IN_SECONDS)
                                .withMisfireHandlingInstructionNextWithRemainingCount()
                                .repeatForever())
                .build();
    }
}
 

Работа

 @Slf4j
@Component
@RequiredArgsConstructor
@DisallowConcurrentExecution
@PersistJobDataAfterExecution
public class CompanyProfilePublishingJob extends QuartzJobBean {
...
}
 

Ответ №1:

Я думаю, вам нужно показать и свойства подключения к базе данных. Вы создали JobDetail после добавления аннотации @DisallowConcurrentExecution? Потому что только существование этой аннотации управляет одним экземпляром задания за раз.