Как добавить балансировку выполнения Quartz Job между нодами для триггера с единственным срабатыванием?

Не работает кластеризация при ручном запуске задачи Quartz. Пример проблемного кода:

    @Autowired
private Scheduler scheduler;

public void runJobs() {
    for(int i = 0; i < 10; i++) {
        final JobDetail jobDetail = JobBuilder.newJob(SingleJob.class)
                .usingJobData("id", String.valueOf(i)).build();
        final Trigger trigger = TriggerBuilder.newTrigger().build();
        try {
            scheduler.scheduleJob(jobDetail, trigger);
        } catch (final SchedulerException e) {
            log.error("Error while running SingleJob", e);
        }
    }
}

Задачи, запущенные таким образом выполняются в рамках одного нода, хотя в конфиг файле явно задана условие кластеризации. application.yml

org.quartz:
  threadPool:
    threadCount: 5
  scheduler:
    instanceName: user
    instanceId: AUTO
  jobStore:
    class: org.quartz.impl.jdbcjobstore.JobStoreTX
    driverDelegateClass: org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
    useProperties: true
    misfireThreshold: 60000
    tablePrefix: QRTZ_
    isClustered: true
    clusterCheckinInterval: 20000

Пример класса джебы:

@Slf4j
@Component
@NoArgsConstructor
@DisallowConcurrentExecution
public class SingleJob implements Job {
    @Override
    public void execute(final JobExecutionContext context) {
        log.debug("execute() - start: context = {}", context);
        log.debug("execute() - end");
    }
}

Сам джава конфиг с бином Scheduler'а:

public class QuartzConf {
    @Value("${quartz.job.status.interval:60000}")
    private Long interval;
    @Value("${quartz.job.status.requestsRecovery:true}")
    private Boolean requestsRecovery;
    @Value("${quartz.job.status.durability:true}")
    private Boolean durability;
    @Getter
    @Setter
    private Map<String, String> quartz;

    @Bean
    public SchedulerFactoryBean scheduler(final DataSource dataSource,
                                          final AutowiringSpringBeanJobFactory jobFactory,
                                          final PlatformTransactionManager transactionManager,
                                          final Trigger... triggers) {
        final SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean();
        schedulerFactory.setOverwriteExistingJobs(true);
        schedulerFactory.setAutoStartup(true);
        schedulerFactory.setQuartzProperties(quartzProperties());
        schedulerFactory.setTransactionManager(transactionManager);
        schedulerFactory.setDataSource(dataSource);
        schedulerFactory.setJobFactory(jobFactory);
        schedulerFactory.setWaitForJobsToCompleteOnShutdown(true);
        if (ArrayUtils.isNotEmpty(triggers)) {
            schedulerFactory.setTriggers(triggers);
        }
        return schedulerFactory;
    }

    public Properties quartzProperties() {
        final Properties properties = new Properties();
        quartz.forEach((key, value) -> properties.put("org.quartz." + key, value));
        return properties;
    }

//Другие автоматические триггеры...

}

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


Ответы (0 шт):