Quartz Scheduler เป็น Open Source Project นิยมนำมาใช้งานกับโปรเจคระดับองค์กร ทำหน้าที่เป็นเครื่องมือจัดการเรื่อง Job Scheduler คล้ายกับ Cron ในระบบปฏิบัติการ linux ช่วยจัดการเรื่อง Job ที่มีการทำงานตั้งแต่ 1 Process ขึ้นไปใช้กับงาน Process ที่ต้องใช้เวลาในการ Processing ยาวนานกินเวลาหลายชั่วโมง ภายใน quartz-scheduler จะมี Class CronTrigger ซึ่งช่วยทำหน้าที่จัดการเวลาการทำงาน เช่น “ตอน 8.00 น.ทุกวันจันทร์ถึงวันศุกร์” หรือ “เวลา 1.30 น. ทุกวันศุกร์สุดท้ายของเดือน” ช่วยเพิ่มประสิทธิภาพการจัด scheduler ได้ออย่างดี
เริ่มต้นการใช้งาน
เพิ่ม dependency ในไฟล์ pom.xml
<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>1.8.6</version> </dependency>
สร้าง Class Job Execute
public class DumbJob implements Job{
  public void execute(JobExecutionContext arg0) throws JobExecutionException {
    System.out.println("Poolsawat.com Run Scheduler Job");		
  }
}
ตัวอย่าง ตั้งเวลาการทำงานทุกนาที โดยเริ่มทำงานตอนทำงานในนาทีถัดไปหลังจากสั่งเริ่มการทำงาน
try {	
  SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();
  
  Scheduler sched = schedFact.getScheduler();
  sched.start();
  JobDetail jobDetail = new JobDetail("myJob", null, DumbJob.class);
  Trigger trigger = TriggerUtils.makeMinutelyTrigger();
  trigger.setStartTime(TriggerUtils.getEvenMinuteDate(new Date()));
  trigger.setName("myTrigger");
  sched.scheduleJob(jobDetail, trigger);
} catch (SchedulerException e) {
  e.printStackTrace();
}
ตัวอย่าง ตั้งเวลาการทำงานช่วงเวลา 00:00 น. โดยเริ่มทำงานทันที่
try {
  SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();
  Scheduler sched = schedFact.getScheduler();
  JobDetail jobDetail = new JobDetail("myJob",
      Scheduler.DEFAULT_GROUP, 
      DumbJob.class);
  
  Trigger trigger = TriggerUtils.makeDailyTrigger(0, 0);
  trigger.setStartTime(new Date());
  trigger.setName("myTrigger");
  sched.scheduleJob(jobDetail, trigger);
} catch (SchedulerException e) {
  e.printStackTrace();
}
สร้าง Class Job ที่รับ Parameter
public class DataMapJob implements Job{
  public void execute(JobExecutionContext context) throws JobExecutionException {
    JobDetail detail = context.getJobDetail();
    JobDataMap mapData = detail.getJobDataMap();		
    System.out.println("param1 ::=="+mapData.getString("param1"));
    System.out.println("param2 ::=="+mapData.getString("param2"));
  }
}
ตัวอย่าง การส่งค่า Parameter เข้า Process ภายใน Class Job
try {
  SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();
  Scheduler sched = schedFact.getScheduler();
  sched.start();
  JobDetail jobDetail = new JobDetail("myJob", null, DataMapJob.class);
  
  
  JobDataMap dataMap = new JobDataMap();
  dataMap.put("param1", "poolsawat.com");
  dataMap.put("param2", "quartz");
  jobDetail.setJobDataMap(dataMap);
  
  Trigger trigger = TriggerUtils.makeMinutelyTrigger();
  trigger.setStartTime(TriggerUtils.getEvenMinuteDate(new Date()));
  trigger.setName("myTrigger");
  sched.scheduleJob(jobDetail, trigger);
} catch (SchedulerException e) {
  e.printStackTrace();
}
ตัวอย่าง ตั้งค่าใน Job ทำงานแค่ครั้งเดียว
try {
  SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();
  Scheduler sched = schedFact.getScheduler();
  sched.start();
  JobDetail jobDetail = new JobDetail("myJob", null, DataMapJob.class);
  
  SimpleTrigger trigger = new SimpleTrigger("myTrigger",
      null,
      new Date(),
      null,
      0,
      0L);
  
  sched.scheduleJob(jobDetail, trigger);
} catch (Exception e) {
  e.printStackTrace();
}