use of org.finra.herd.core.AutowiringQuartzSpringBeanJobFactory in project herd by FINRAOS.
the class ServiceSpringModuleConfig method quartzScheduler.
/**
* Gets a Quartz scheduler factory bean that can return a Quartz scheduler.
*
* @return the Quartz scheduler factory bean.
* @throws Exception if the bean couldn't be created.
*/
@Bean
public SchedulerFactoryBean quartzScheduler() throws Exception {
SchedulerFactoryBean quartzScheduler = new SchedulerFactoryBean();
AutowiringQuartzSpringBeanJobFactory jobFactory = new AutowiringQuartzSpringBeanJobFactory();
jobFactory.setApplicationContext(applicationContext);
quartzScheduler.setJobFactory(jobFactory);
// Name our scheduler.
quartzScheduler.setSchedulerName("herdScheduler");
// Setup the scheduler to use Spring’s dataSource and transactionManager.
quartzScheduler.setDataSource(herdDataSource);
quartzScheduler.setTransactionManager(herdTransactionManager);
// Create the Quartz tables for JUnits.
if (shouldCreateQuartzTables()) {
ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator();
resourceDatabasePopulator.addScript(new ClassPathResource("createQuartzTables.sql"));
// This is what the DataSourceInitializer does.
DatabasePopulatorUtils.execute(resourceDatabasePopulator, herdDataSource);
}
// Set quartz properties. Please note that Spring uses LocalDataSourceJobStore extension of JobStoreCMT.
Properties quartzProperties = new Properties();
quartzScheduler.setQuartzProperties(quartzProperties);
// Configure Main Main Scheduler Properties. The "instance" parameters are needed to manage cluster instances.
quartzProperties.setProperty(StdSchedulerFactory.PROP_SCHED_INSTANCE_NAME, "herdSystemJobScheduler");
quartzProperties.setProperty(StdSchedulerFactory.PROP_SCHED_INSTANCE_ID, StdSchedulerFactory.AUTO_GENERATE_INSTANCE_ID);
// Configure ThreadPool.
quartzProperties.setProperty(StdSchedulerFactory.PROP_THREAD_POOL_CLASS, "org.quartz.simpl.SimpleThreadPool");
quartzProperties.setProperty("org.quartz.threadPool.threadCount", configurationHelper.getProperty(ConfigurationValue.SYSTEM_JOBS_THREAD_POOL_THREAD_COUNT));
quartzProperties.setProperty("org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread", "true");
// Configure JobStore.
quartzProperties.setProperty("org.quartz.jobStore.tablePrefix", "QRTZ_");
quartzProperties.setProperty("org.quartz.jobStore.isClustered", "true");
quartzProperties.setProperty(ConfigurationValue.QUARTZ_JOBSTORE_DRIVER_DELEGATE_CLASS.getKey(), getQuartzDatabaseDelegateClass());
// Build a list of system jobs to be scheduled.
Map<String, AbstractSystemJob> systemJobs = applicationContext.getBeansOfType(AbstractSystemJob.class);
List<JobDetail> jobDetails = new ArrayList<>();
List<CronTrigger> triggers = new ArrayList<>();
for (Map.Entry<String, AbstractSystemJob> entry : systemJobs.entrySet()) {
// Prepare job detail and trigger for the system job.
String jobName = entry.getKey();
AbstractSystemJob systemJob = entry.getValue();
JobDetail jobDetail = newJob(systemJob.getClass()).withIdentity(jobName).storeDurably().requestRecovery().build();
TriggerKey jobTriggerKey = TriggerKey.triggerKey(jobName + AbstractSystemJob.CRON_TRIGGER_SUFFIX);
CronTrigger trigger = newTrigger().withIdentity(jobTriggerKey).forJob(jobName).usingJobData(systemJob.getJobDataMap()).withSchedule(cronSchedule(systemJob.getCronExpression())).build();
// Add this system job to the list of jobs/triggers to be scheduled.
jobDetails.add(jobDetail);
triggers.add(trigger);
}
// Schedule the system jobs and set a flag to overwrite already registered jobs that would be read in from the database (persistent job store).
quartzScheduler.setOverwriteExistingJobs(true);
quartzScheduler.setJobDetails(jobDetails.toArray(new JobDetail[jobDetails.size()]));
quartzScheduler.setTriggers(triggers.toArray(new CronTrigger[triggers.size()]));
return quartzScheduler;
}
Aggregations