Schedule multiple jobs using Spring Quartz scheduler


Multiple Jobs

  • We can pass multiple jobs to spring quartz scheduler along with multiple triggers or single same trigger.

  • Need to create multiple Job classes that implements Job interface.

  • Create multiple Triggers by passing different scheduling times.

Scheduler Job 1 code

package com.oc;

import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.stereotype.Component;

@Component
public class MyJob1 implements Job {

	@Override
	public void execute(JobExecutionContext argContext) throws JobExecutionException {
		System.out.println("I am scheduled on " + new Date(System.currentTimeMillis()));
		System.out.println("MyJob 1" + argContext.getJobDetail().getJobDataMap());
	}

}

Scheduler Job 2 code

package com.oc;

import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.stereotype.Component;

@Component
public class MyJob2 implements Job {

	@Override
	public void execute(JobExecutionContext argContext) throws JobExecutionException {
		System.out.println("I am scheduled on " + new Date(System.currentTimeMillis()));
		System.out.println("MyJob 2" + argContext.getJobDetail().getJobDataMap());
	}

}

Scheduler configuration code

package com.oc;

import static org.quartz.SimpleScheduleBuilder.simpleSchedule;

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.ScheduleBuilder;
import org.quartz.Scheduler;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.scheduling.quartz.SpringBeanJobFactory;

public class MyScheduler {

	public static Scheduler scheduler() throws Exception {
		StdSchedulerFactory factory = new StdSchedulerFactory();
		factory.initialize(new ClassPathResource("quartz.properties").getInputStream());

		// Job1 configuration
		JobDetail job1 = JobBuilder.newJob(MyJob1.class).build();
		job1.getJobDataMap().put("key", "job1");
		Trigger trigger1 = TriggerBuilder.newTrigger().forJob(job1).withSchedule(getScheduleBuilder()).build();

		// Job2 configuration
		JobDetail job2 = JobBuilder.newJob(MyJob2.class).build();
		job2.getJobDataMap().put("key", "job2");
		Trigger trigger2 = TriggerBuilder.newTrigger().forJob(job2).withSchedule(getScheduleBuilder()).build();

		Scheduler scheduler = factory.getScheduler();
		scheduler.setJobFactory(new SpringBeanJobFactory());
		
		//Schedule 1st job
		scheduler.scheduleJob(job1, trigger1);
		
		//Schedule 2nd job
		scheduler.scheduleJob(job2, trigger2);
		
		scheduler.start();
		return scheduler;
	}

	private static ScheduleBuilder<SimpleTrigger> getScheduleBuilder() {
		return simpleSchedule().repeatForever().withIntervalInMinutes(1);
	}

}

** Note: ** In above code we scheduled 2 jobs on same scheduler, we can also create one more scheduler to schedule the other job but that is not recommended way.