Кварцевый кластер - @DisallowConcurrentExecution позволяет избежать параллельного запуска экземпляров - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть приложение springBoot, в котором запущены Quarts (2.3.0) с режим кластера true в нескольких случаях.

, и я настроил задание и предоставил задержку в 2 секунды между каждым запуском.

@Configuration
public class SchedulerConfig {


  @Bean
  public JobDetail jobDetail() {
    return JobBuilder.newJob()
            .ofType(BatchTriggerJob.class)
            .storeDurably()
            .withIdentity("SCHEDULER")
            .withDescription("event")
            .build();
  }

  @Bean
  public Trigger trigger() {
    return TriggerBuilder
            .newTrigger()
            .forJob(jobDetail())
            .withIdentity("BATCH")
            .withDescription("SCHEDULER")
            .withSchedule(SimpleScheduleBuilder.simpleSchedule().repeatForever().withIntervalInSeconds(2)
                    .withMisfireHandlingInstructionIgnoreMisfires())
            .build();
  }

}

Я включил DisallowConcurrentExecution

@DisallowConcurrentExecution
public class BatchTriggerJob extends QuartzJobBean {

  @Autowired
  private SchedulerService schedulerService;

  @Override
  protected void executeInternal(JobExecutionContext context) {
    SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
    schedulerService.processBatch(); //business logic and may take more than 2 sec
  }

}

application.yml

quartz:
    job-store-type: jdbc
    jdbc:
      initialize-schema: always
    properties:
      org:
        quartz:
          scheduler:
            instanceName: EVENT_SCHEDULER
            instanceId: AUTO
          jobStore:
            isClustered: true
            misfireThreshold: 60000
            class: org.quartz.impl.jdbcjobstore.JobStoreTX
            driverDelegateClass: org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
            tablePrefix: QRTZ_
          threadPool:
            threadCount: 1

Однако, если время обработки задания превышает 2 секунды, другой экземпляр начнет выполнение задания .

Я хочу, чтобы последовательное выполнение выполнялось для всех экземпляров с включенным режимом кластера, и запускать другое задание для другого экземпляра можно только в том случае, если текущее задание завершено в другом экземпляре.

PS: с одним даже если задержка узла меньше времени обработки. задание выполняется последовательно из-за @ DisallowConcurrentExecution

...