我们有一个弹簧配置的集群石英调度程序,可以在我们所有的服务器上运行。其中一些服务器是应用服务器,还有一些服务器用于运行后台任务,主要是从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;
}