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