Search in sources :

Example 1 with AbstractSystemJob

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;
}
Also used : CronTrigger(org.quartz.CronTrigger) AbstractSystemJob(org.finra.herd.service.systemjobs.AbstractSystemJob) ResourceDatabasePopulator(org.springframework.jdbc.datasource.init.ResourceDatabasePopulator) ArrayList(java.util.ArrayList) AutowiringQuartzSpringBeanJobFactory(org.finra.herd.core.AutowiringQuartzSpringBeanJobFactory) Properties(java.util.Properties) ClassPathResource(org.springframework.core.io.ClassPathResource) TriggerKey(org.quartz.TriggerKey) JobDetail(org.quartz.JobDetail) SchedulerFactoryBean(org.springframework.scheduling.quartz.SchedulerFactoryBean) Map(java.util.Map) HashMap(java.util.HashMap) ProcessEngineFactoryBean(org.activiti.spring.ProcessEngineFactoryBean) SchedulerFactoryBean(org.springframework.scheduling.quartz.SchedulerFactoryBean) Bean(org.springframework.context.annotation.Bean)

Example 2 with AbstractSystemJob

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);
}
Also used : TriggerKey(org.quartz.TriggerKey) TriggerBuilder.newTrigger(org.quartz.TriggerBuilder.newTrigger) Trigger(org.quartz.Trigger) AbstractSystemJob(org.finra.herd.service.systemjobs.AbstractSystemJob) ObjectNotFoundException(org.finra.herd.model.ObjectNotFoundException) ObjectNotFoundException(org.finra.herd.model.ObjectNotFoundException) SchedulerException(org.quartz.SchedulerException)

Aggregations

AbstractSystemJob (org.finra.herd.service.systemjobs.AbstractSystemJob)2 TriggerKey (org.quartz.TriggerKey)2 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 Map (java.util.Map)1 Properties (java.util.Properties)1 ProcessEngineFactoryBean (org.activiti.spring.ProcessEngineFactoryBean)1 AutowiringQuartzSpringBeanJobFactory (org.finra.herd.core.AutowiringQuartzSpringBeanJobFactory)1 ObjectNotFoundException (org.finra.herd.model.ObjectNotFoundException)1 CronTrigger (org.quartz.CronTrigger)1 JobDetail (org.quartz.JobDetail)1 SchedulerException (org.quartz.SchedulerException)1 Trigger (org.quartz.Trigger)1 TriggerBuilder.newTrigger (org.quartz.TriggerBuilder.newTrigger)1 Bean (org.springframework.context.annotation.Bean)1 ClassPathResource (org.springframework.core.io.ClassPathResource)1 ResourceDatabasePopulator (org.springframework.jdbc.datasource.init.ResourceDatabasePopulator)1 SchedulerFactoryBean (org.springframework.scheduling.quartz.SchedulerFactoryBean)1