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.