use of org.finra.herd.service.systemjobs.AbstractSystemJob 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;
}
use of org.finra.herd.service.systemjobs.AbstractSystemJob in project herd by FINRAOS.
the class SystemJobHelper method runSystemJob.
/**
* Starts a system job asynchronously.
*
* @param jobName the system job name (case-sensitive)
* @param parameters the list of parameters
*
* @throws org.quartz.SchedulerException if fails to schedule the system job
*/
public void runSystemJob(String jobName, List<Parameter> parameters) throws SchedulerException {
// Validate the system job name.
AbstractSystemJob systemJob;
try {
systemJob = (AbstractSystemJob) applicationContext.getBean(jobName);
} catch (Exception e) {
throw new ObjectNotFoundException(String.format("System job with name \"%s\" doesn't exist.", jobName), e);
}
// Validate parameters per relative system job.
systemJob.validateParameters(parameters);
// Prepare a trigger to run the system job only once.
TriggerKey triggerKey = TriggerKey.triggerKey(jobName + AbstractSystemJob.RUN_ONCE_TRIGGER_SUFFIX);
Trigger trigger = newTrigger().withIdentity(triggerKey).forJob(jobName).usingJobData(systemJob.getJobDataMap(parameters)).startNow().build();
LOGGER.debug(String.format("schedule job with trigger: calendarName: %s, description: %s, endTime: %s, finalFireTime: %s, jobKey: %s, key: %s, " + "misfireInstruction: %s, nextFireTime: %s, previousFireTime: %s, priority: %s, startTime: %s", trigger.getCalendarName(), trigger.getDescription(), trigger.getEndTime(), trigger.getFinalFireTime(), trigger.getJobKey(), trigger.getKey(), trigger.getMisfireInstruction(), trigger.getNextFireTime(), trigger.getPreviousFireTime(), trigger.getPriority(), trigger.getStartTime()));
// Schedule the system job.
schedulerFactory.getScheduler().scheduleJob(trigger);
}
Aggregations