У меня есть приложение 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