Sharing is caring!

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();
}

เพิ่มเติม…