Как добавить балансировку выполнения 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;
}
//Другие автоматические триггеры...
}
Удивительно, что остальные триггеры определённые в джава конфиге выполняются на разных нодах. Только при ручном задании выполнение происходит в рамках одного нода - возможно у меня там ошибка на этапе создания джёбы, только вот не могу понять какая