Peter Penzov
Peter Penzov

Reputation: 1648

Add many Java Classes as Quartz jobs

I have this Quartz configuration which I use to start a single job:

@Configuration
public class SchedulerConfig {

    private static final Logger LOG = LoggerFactory.getLogger(SchedulerConfig.class);

    private ApplicationContext applicationContext;

    @Autowired
    public SchedulerConfig(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }

    @Bean
    public JobFactory jobFactory() {
        AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();
        jobFactory.setApplicationContext(applicationContext);
        return jobFactory;
    }

    @Bean
    public SchedulerFactoryBean schedulerFactoryBean(Trigger simpleJobTrigger) throws IOException {

        SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean();
        schedulerFactory.setQuartzProperties(quartzProperties());
        schedulerFactory.setWaitForJobsToCompleteOnShutdown(true);
        schedulerFactory.setAutoStartup(true);
        schedulerFactory.setTriggers(simpleJobTrigger);
        schedulerFactory.setJobFactory(jobFactory());
        return schedulerFactory;
    }

    @Bean
    public SimpleTriggerFactoryBean simpleJobTrigger(@Qualifier("keywordPostJobDetail") JobDetail jobDetail,
                                                     @Value("${simplejob.frequency}") long frequency) {
        LOG.info("simpleJobTrigger");

        SimpleTriggerFactoryBean factoryBean = new SimpleTriggerFactoryBean();
        factoryBean.setJobDetail(jobDetail);
        factoryBean.setStartDelay(0L);
        factoryBean.setRepeatInterval(frequency);
        factoryBean.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY); // factoryBean.setRepeatCount(0); //
        return factoryBean;
    }

    @Bean
    public JobDetailFactoryBean keywordPostJobDetail() {
        JobDetailFactoryBean factoryBean = new JobDetailFactoryBean();
        // Add here more Java Classes
        factoryBean.setJobClass(DomainOrgCheckJob.class);
        factoryBean.setDurability(true);
        return factoryBean;
    }

    public Properties quartzProperties() throws IOException {
        PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
        propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties"));
        propertiesFactoryBean.afterPropertiesSet();
        return propertiesFactoryBean.getObject();
    }
}

How I can add more Java classes which can run as a second or more jobs? Do I need to add more @Bean-s?

Upvotes: 0

Views: 130

Answers (1)

TriS
TriS

Reputation: 4038

The main concept for scheduling your multiple jobs are -

  1. We need to create multiple Job classes.
  2. Then pass the Job classes to the JobDetails to create an individual JobDetailFactoryBean.
  3. Therafter create trigger(s) to fire the JobDetails using SimpleTriggerFactoryBean.
  4. At last send all the JobDetails in the scheduler along with the triggers to run the jobs using a scheduled manner.

Below is an example with two jobs :

@Bean
public SchedulerFactoryBean schedulerFactoryBean(List<JobDetail> jobDetails,
                                      List<Trigger> triggers) {

    SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean();
    schedulerFactory.setConfigLocation(new ClassPathResource("quartz.properties"));

    LOGGER.debug("Setting the jobs Scheduler up");
    schedulerFactory.setJobFactory(jobFactory());
    schedulerFactory.setWaitForJobsToCompleteOnShutdown(true);
    schedulerFactory.setAutoStartup(true);
    //Multiple jobs are passed as an array
    schedulerFactory.setJobDetails(jobDetails.toArray(JobDetail[] ::new));
    //Multiple triggers are passed as an array
    schedulerFactory.setTriggers(triggers.toArray(Trigger[] ::new));
    return schedulerFactory;
}


@Bean(name = "FirstJob")
public JobDetailFactoryBean firstJob() {

    JobDetailFactoryBean jobDetailFactory = new JobDetailFactoryBean();
    jobDetailFactory.setJobClass(FirstDomainOrgCheckJob.class);
    jobDetailFactory.setDurability(true);
    return jobDetailFactory;
}

@Bean
public SimpleTriggerFactoryBean firstJobTrigger(@Qualifier("FirstJob") JobDetail job,
                                                @Value("${first.job.frequency}") long frequency) {

    LOGGER.info("First Job Trigger");

    SimpleTriggerFactoryBean factoryBean = new SimpleTriggerFactoryBean();
    factoryBean.setJobDetail(job);
    factoryBean.setStartDelay(0L);
    factoryBean.setRepeatInterval(frequency);
    factoryBean.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);
    return factoryBean;
}

@Bean(name = "SecondJob")
public JobDetailFactoryBean secondJob() {

    JobDetailFactoryBean jobDetailFactory = new JobDetailFactoryBean();
    jobDetailFactory.setJobClass(SecondDomainOrgCheckJob.class);
    jobDetailFactory.setDurability(true);
    return jobDetailFactory;
}

@Bean
public SimpleTriggerFactoryBean secondJobTrigger(@Qualifier("SecondJob") JobDetail job,
                                                 @Value("${second.job.frequency}") long frequency) {

    LOGGER.info("Second Job Trigger");

    SimpleTriggerFactoryBean factoryBean = new SimpleTriggerFactoryBean();
    factoryBean.setJobDetail(job);
    factoryBean.setStartDelay(0L);
    factoryBean.setRepeatInterval(frequency);
    factoryBean.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);
    return factoryBean;
}

Logs

FirstDomainOrgCheckJob   : FirstJob fired at Sun Nov 27 12:43:33 UTC 2022
SecondDomainOrgCheckJob  : SecondJob fired at Sun Nov 27 12:43:33 UTC 2022

Upvotes: 1

Related Questions