quartz---的Scheduler
從這副圖中可以很直觀的看出來quartz的關系:
調度:Scheduler任務調度器,是實際執行任務調度的控制器。在spring中通過SchedulerFactoryBean封裝起來。
觸發器:Trigger 觸發器,用於定義任務調度的時間規則,有SimpleTrigger,CronTrigger,DateIntervalTrigger和NthIncludedDayTrigger,其中CronTrigger用的比較多,本文主要介紹這種方式。CronTrigger在spring中封裝在CronTriggerFactoryBean中。
1)scheduler.start();scheduler.standby();用代碼解釋:
1 package com.imooc.demo.helloQuartz; 2 3 import java.text.SimpleDateFormat; 4 import java.util.Date; 5 6 import org.quartz.CronScheduleBuilder; 7 import org.quartz.CronTrigger; 8 import org.quartz.JobBuilder; 9 import org.quartz.JobDetail; 10 import org.quartz.Scheduler; 11 import org.quartz.SchedulerException; 12 import org.quartz.SchedulerFactory; 13 import org.quartz.TriggerBuilder; 14 import org.quartz.impl.StdSchedulerFactory; 15 16 public class HelloScheduler { 17 18 public static void main(String[] args) throws SchedulerException, InterruptedException { 19 Date date = new Date(); 20 SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 21 System.out.println("Current Time is:"+sf.format(date)); 22 // 創建一個jobDatail實例,將該實力與helloJob綁定 23 JobDetail detail = JobBuilder.newJob(HelloJob.class).withIdentity("myJob") 24 .build(); 25 26 //美每秒觸發一次任務 27 CronTrigger trigger = (CronTrigger)TriggerBuilder 28 .newTrigger() 29 .withIdentity("myTrigger", "group1") 30 //2017-2019每月的第二周的星期5下午14開始觸發,每隔5秒允許一次 31 .withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ?")) 32 .build(); 33 // 創建Scheduler實例 34 SchedulerFactory factory = new StdSchedulerFactory(); 35 Scheduler scheduler = factory.getScheduler(); 36 scheduler.start(); 37 // 把jobDetail和Trigger與scheuler綁定在一起:觸發啟動 38 System.out.println("----:"+sf.format(scheduler.scheduleJob(detail, trigger)));; 39 Thread.sleep(2000L); 40 //掛起 41 scheduler.standby(); 42 43 //scheduler掛起3秒后繼續執行 44 Thread.sleep(3000L); 45 scheduler.start(); 46 } 47 }
每秒執行一次,2秒后停止,執行3次后停止執行,運行結果:
2)shutdown();
1 package com.imooc.demo.helloQuartz; 2 3 import java.text.SimpleDateFormat; 4 import java.util.Date; 5 6 import org.quartz.CronScheduleBuilder; 7 import org.quartz.CronTrigger; 8 import org.quartz.JobBuilder; 9 import org.quartz.JobDetail; 10 import org.quartz.Scheduler; 11 import org.quartz.SchedulerException; 12 import org.quartz.SchedulerFactory; 13 import org.quartz.TriggerBuilder; 14 import org.quartz.impl.StdSchedulerFactory; 15 16 public class HelloScheduler { 17 18 public static void main(String[] args) throws SchedulerException, InterruptedException { 19 Date date = new Date(); 20 SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 21 System.out.println("Current Time is:"+sf.format(date)); 22 // 創建一個jobDatail實例,將該實力與helloJob綁定 23 JobDetail detail = JobBuilder.newJob(HelloJob.class).withIdentity("myJob") 24 .build(); 25 26 //美每秒觸發一次任務 27 CronTrigger trigger = (CronTrigger)TriggerBuilder 28 .newTrigger() 29 .withIdentity("myTrigger", "group1") 30 //2017-2019每月的第二周的星期5下午14開始觸發,每隔5秒允許一次 31 .withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ?")) 32 .build(); 33 // 創建Scheduler實例 34 SchedulerFactory factory = new StdSchedulerFactory(); 35 Scheduler scheduler = factory.getScheduler(); 36 scheduler.start(); 37 // 把jobDetail和Trigger與scheuler綁定在一起:觸發啟動 38 System.out.println("----:"+sf.format(scheduler.scheduleJob(detail, trigger)));; 39 Thread.sleep(2000L); 40 //掛起 41 scheduler.shutdown(); 42 43 //scheduler掛起3秒后繼續執行 44 Thread.sleep(3000L); 45 scheduler.start(); 46 } 47 }
運行結果為:
總結 :
在shutdown()后,程序不能再從新start().
1 package com.imooc.demo.helloQuartz; 2 3 import java.text.SimpleDateFormat; 4 import java.util.Date; 5 6 import org.quartz.CronScheduleBuilder; 7 import org.quartz.CronTrigger; 8 import org.quartz.JobBuilder; 9 import org.quartz.JobDetail; 10 import org.quartz.Scheduler; 11 import org.quartz.SchedulerException; 12 import org.quartz.SchedulerFactory; 13 import org.quartz.TriggerBuilder; 14 import org.quartz.impl.StdSchedulerFactory; 15 16 public class HelloScheduler { 17 18 public static void main(String[] args) throws SchedulerException, InterruptedException { 19 Date date = new Date(); 20 SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 21 System.out.println("Current Time is:"+sf.format(date)); 22 // 創建一個jobDatail實例,將該實力與helloJob綁定 23 JobDetail detail = JobBuilder.newJob(HelloJob.class).withIdentity("myJob") 24 .build(); 25 26 //美每秒觸發一次任務 27 CronTrigger trigger = (CronTrigger)TriggerBuilder 28 .newTrigger() 29 .withIdentity("myTrigger", "group1") 30 //2017-2019每月的第二周的星期5下午14開始觸發,每隔5秒允許一次 31 .withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ?")) 32 .build(); 33 // 創建Scheduler實例 34 SchedulerFactory factory = new StdSchedulerFactory(); 35 Scheduler scheduler = factory.getScheduler(); 36 scheduler.start(); 37 // 把jobDetail和Trigger與scheuler綁定在一起:觸發啟動 38 System.out.println("----:"+sf.format(scheduler.scheduleJob(detail, trigger)));; 39 Thread.sleep(2000L); 40 //shutdown(true)標志等待所有正在執行的job執行完之后,再關閉scheduler 41 //shutdown(false)即shutdown()表示job執行完畢之后,再關閉scheduler 42 //shutdown掛起3秒后繼續執行 43 scheduler.shutdown(true); 44 System.out.println("scheruler is shut down?:"+scheduler.isShutdown()); 45 46 } 47 }
運行結果:
總結 :
shutdown(true)標志等待所有正在執行的job執行完之后,再關閉scheduler
總結 :
shutdown(false)即關閉scheduler ,然后執行job之后,關掉程序