У нас есть настроенный пружиной кластерный кварцевый планировщик, который работает на всех наших серверах.Некоторые из этих серверов являются серверами приложений, а некоторые отведены для выполнения фоновых задач, в основном для извлечения заданий из ActiveMQ
. Проблема в том, что в коде есть несколько мест, в которые мы вводим Scheduler
для планирования вручнуюрабочие места во время выполнения.Через очередь сообщений мы можем убедиться, что единственными классами, выполняющими ручное внедрение, являются серверы фоновых заданий.
Все серверы работают с одинаковой кодовой базой
Как настроить Quartz так, чтобы он запускал планировщик только на фоновых серверах, но при этом гарантировал, что все @Autowire
из Scheduler
по-прежнемууспешно
Настройка через
<bean id="quartzConfig" class="com.company.quartz.QuartzConfig"/>
и
@Bean
public JobFactory autowireCapableSpringBeanJobFactory() {
AutowireCapableSpringBeanJobFactory jobFactory = new AutowireCapableSpringBeanJobFactory();
jobFactory.setIgnoredUnknownProperties("applicationContext");
return jobFactory;
}
@Bean
public SchedulerFactoryBean quartzScheduler(@Qualifier("nonXADataSource") DataSource nonXADataSource, PlatformTransactionManager transactionManager,
ResourceLoader resourceLoader) {
SchedulerFactoryBean scheduler = new SchedulerFactoryBean();
scheduler.setConfigLocation(resourceLoader.getResource("classpath:quartz.properties"));
scheduler.setSchedulerName("quartzScheduler");
scheduler.setApplicationContextSchedulerContextKey("applicationContext");
scheduler.setNonTransactionalDataSource(nonXADataSource);
scheduler.setTransactionManager(transactionManager);
scheduler.setJobFactory(autowireCapableSpringBeanJobFactory());
scheduler.setOverwriteExistingJobs(overwriteExistingJobs);
scheduler.setAutoStartup(autoStartup);
scheduler.setWaitForJobsToCompleteOnShutdown(waitForJobsToCompleteOnShutdown);
// add a bunch of triggers
return scheduler;
}