簡單回顧一下上一節學習到的 "HelloWorld "java
1 建立一個job類,實現Job接口,覆蓋 public void execute(JobExecutionContext context) 方法,在方法中寫入你要執行的操做(數據導入/備份,輪詢檢查文件等)代碼node
2 建立一個主線程類, 得到 Scheduler 對象框架
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler sched = sf.getScheduler(); ide
得到要執行的對象 JobDetail job = newJob(HelloJob.class).withIdentity("job1", "group1").build();學習
定義觸發器 Trigger trigger = newTrigger().withIdentity("trigger1", "group1").startAt(runTime).build();測試
將任務和Trigger放入scheduler : ui
sched.scheduleJob(job, trigger);spa
啓動 和 中止
sched.start(); sched.shutdown(true);.net
注意 給job 留有足夠長的時間,若是主線程類中止工做,job線程也會中止工做線程
---------------------------------------我是分割線--------------------------------------------------------
通過了 "HelloWorld" 以後,您老人家可能對 Quartz 有所瞭解,下面讓咱們繼續深刻,學習下Quartz 重複執行任務該怎麼作
簡單的說就是 觸發器(Trigger)的參數設置. 什麼? 觸發器(Trigger)不知道是什麼?
出門左轉 <<做業調度框架 Quartz 學習筆記(一)>> 不謝
仍是老套路,一個job 類,一個主線程類
SimpleJob.java
package net.itaem.annnodemo.anno.task.task1; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import java.text.SimpleDateFormat; import java.util.Calendar; /** * Created with IntelliJ IDEA. * Description: * User: zhubo * Date: 2017-10-24 * Time: 15:33 */ public class SimpleJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { // job 的名字 String jobName = context.getJobDetail().getKey().getName(); // 任務執行的時間 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy 年 MM 月 dd 日 HH 時 mm 分 ss 秒"); String jobRunTime = dateFormat.format(Calendar.getInstance().getTime()); // 輸出任務執行狀況 System.out.println("任務 : " + jobName + " 在 " +jobRunTime + " 執行了 "); } }
在這裏 對輸出 的日期進行了一小下 格式化,適應國人習慣.
其它沒什麼好說的 0.0
SimpleTriggerExample.java
package net.itaem.annnodemo.anno.task.task1; import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; import java.text.SimpleDateFormat; import java.util.Date; /** * Created with IntelliJ IDEA. * Description: * User: zhubo * Date: 2017-10-24 * Time: 15:33 */ public class SimpleTriggerExample { public static void main(String[] args) throws Exception { new SimpleTriggerExample().run(); } public void run() throws Exception { // 日期格式化 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy 年 MM 月 dd 日 HH 時 mm 分 ss 秒"); SchedulerFactory sf = new StdSchedulerFactory(); Scheduler sched = sf.getScheduler(); System.out.println("--------------- 初始化 -------------------"); // 下一個第15秒 例: // 當前 10秒,則 執行時間爲15秒 // 當前 16秒,則 執行時間爲30秒 // 當前 33秒,則 執行時間爲45秒 // 當前 48秒,則 執行時間爲00秒 Date startTime = DateBuilder.nextGivenSecondDate(null, 15); // job1 將只會執行一次 JobDetail job = JobBuilder.newJob(SimpleJob.class).withIdentity("job1", "group1").build(); SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger() .withIdentity("trigger1", "group1") .startAt(startTime).build(); // 把job1 和 trigger加入計劃 . ft:此任務要執行的時間 Date ft = sched.scheduleJob(job, trigger); System.out.println(job.getKey().getName() + " 將在 : " + dateFormat.format(ft) + " 時運行.而且重複: " + trigger.getRepeatCount() + " 次, 每次間隔 " + trigger.getRepeatInterval() / 1000 + " 秒"); // job2 將只會和執行一次(和job1同樣同樣的,吼~~) job = JobBuilder.newJob(SimpleJob.class).withIdentity("job2", "group1").build(); trigger = (SimpleTrigger) TriggerBuilder.newTrigger() .withIdentity("trigger2", "group1").startAt(startTime).build(); ft = sched.scheduleJob(job, trigger); System.out.println(job.getKey().getName() + " 將在 : " + dateFormat.format(ft) + " 時運行.而且重複: " + trigger.getRepeatCount() + " 次, 每次間隔 " + trigger.getRepeatInterval() / 1000 + " 秒"); // job3 將執行11次(執行1次,重複10次) ,每10秒重複一次 job = JobBuilder.newJob(SimpleJob.class).withIdentity("job3", "group1").build(); trigger = TriggerBuilder.newTrigger() .withIdentity("trigger3", "group1") .startAt(startTime) .withSchedule( SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(10)// 重複間隔 .withRepeatCount(10)) // 重複次數 .build(); ft = sched.scheduleJob(job, trigger); System.out.println(job.getKey().getName()+ " 將在 : " + dateFormat.format(ft) + " 時運行.而且重複: " + trigger.getRepeatCount() + " 次, 每次間隔 " + trigger.getRepeatInterval() / 1000 + " 秒"); // trigger3 改變了. 每隔10s重複.共重複2次 // 此處說明 , 上面job3已經 設定了 trigger3 重複10次,每次10s // 在這裏又改變了 trigger3的設置,不會對之前構成影響,而是當作一個新的來處理 trigger = TriggerBuilder.newTrigger() .withIdentity("trigger3", "group2") .startAt(startTime) .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(10) .withRepeatCount(2)) .forJob(job).build(); ft = sched.scheduleJob(trigger); System.out.println(job.getKey().getName() + " 改變過trigger3屬性的job3 : " + dateFormat.format(ft) + " 時運行.而且重複: " + trigger.getRepeatCount() + " 次, 每次間隔 " + trigger.getRepeatInterval() / 1000 + " 秒"); // job5 將在5分鐘後運行一次 job = JobBuilder.newJob(SimpleJob.class).withIdentity("job5", "group1").build(); trigger = (SimpleTrigger) TriggerBuilder.newTrigger() .withIdentity("trigger5", "group1") .startAt(DateBuilder.futureDate(5, DateBuilder.IntervalUnit.MINUTE)) // 設定5分鐘後運行 .build(); ft = sched.scheduleJob(job, trigger); System.out.println(job.getKey().getName()+ " 將在 : " + dateFormat.format(ft) + " 時運行.而且重複: " + trigger.getRepeatCount() + " 次, 每次間隔 " + trigger.getRepeatInterval() / 1000 + " 秒"); // job6 每40s運行一次,沒有指定重複次數,則無下限的重複 job = JobBuilder.newJob(SimpleJob.class).withIdentity("job6", "group1").build(); trigger = TriggerBuilder.newTrigger() .withIdentity("trigger6", "group1") .startAt(startTime) .withSchedule( SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(40) .repeatForever()).build(); ft = sched.scheduleJob(job, trigger); System.out.println(job.getKey().getName() + " 將在 : " + dateFormat.format(ft) + " 時運行.而且重複: " + trigger.getRepeatCount() + " 次, 每次間隔 " + trigger.getRepeatInterval() / 1000 + " 秒"); // 全部的任務都被加入到了 scheduler中 ,但只有 schedulers.start(); 時纔開始執行 sched.start(); System.out.println("------- 開始調度 (調用.start()方法) ----------------"); System.out.println("-------系統 啓動 的 時間 :" + dateFormat.format(new Date())); // 在 scheduled.start(); 以後,還能夠將 jobs 添加到執行計劃中 // job7 將重複20次 ,每5分鐘重複一次 job = JobBuilder.newJob(SimpleJob.class).withIdentity("job7", "group1").build(); trigger = TriggerBuilder.newTrigger() .withIdentity("trigger7", "group1") .startAt(startTime) .withSchedule( SimpleScheduleBuilder.simpleSchedule() .withIntervalInMinutes(5) // 5分鐘 .withRepeatCount(20)) // 重複20次 .build(); ft = sched.scheduleJob(job, trigger); System.out.println(job.getKey().getName() + " 將在 : " + dateFormat.format(ft) + " 時運行.而且重複: " + trigger.getRepeatCount() + " 次, 每次間隔 " + trigger.getRepeatInterval() / 1000 + " 秒"); // job8 能夠當即執行. 無trigger註冊 job = JobBuilder.newJob(SimpleJob.class).withIdentity("job8", "group1") .storeDurably().build(); sched.addJob(job, true); System.out.println("手動觸發 job8...(當即執行)"); sched.triggerJob(JobKey.jobKey("job8", "group1")); System.out.println("------- 等待30 秒... --------------"); try { Thread.sleep(30L * 1000L); } catch (Exception e) { } // job7 將立刻執行,重複10次,每秒一次 System.out.println("------- 從新安排 ... --------------------"); trigger = TriggerBuilder.newTrigger() .withIdentity("trigger7", "group1") .startAt(startTime) .withSchedule( SimpleScheduleBuilder.simpleSchedule().withIntervalInMinutes(5) .withRepeatCount(20)).build(); ft = sched.rescheduleJob(trigger.getKey(), trigger); System.out.println("job7 被從新安排 在 : " + dateFormat.format(ft) +" 執行. \r 當前時間 :" + dateFormat.format(new Date())+"預約執行時間已過,任務當即執行"); try { System.out.println("------- 等待5分鐘 ... ------------"); Thread.sleep(300L * 1000L); } catch (Exception e) { } sched.shutdown(true); System.out.println("------- 調度已關閉 ---------------------"); // 顯示一下 已經執行的任務信息 SchedulerMetaData metaData = sched.getMetaData(); System.out.println("~~~~~~~~~~ 執行了 " + metaData.getNumberOfJobsExecuted() + " 個 jobs."); } }
定時任務開始後繼續註冊 與 手動出發啓動定時任務
package net.itaem.annnodemo.anno.task.task1; import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.TimeUnit; /** * Created with IntelliJ IDEA. * Description: * User: zhubo * Date: 2017-10-24 * Time: 15:33 */ public class SimpleTriggerExampleTwo { public static void main(String[] args) throws Exception { new SimpleTriggerExampleTwo().run(); } public void run() throws Exception { // 日期格式化 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy 年 MM 月 dd 日 HH 時 mm 分 ss 秒"); SchedulerFactory sf = new StdSchedulerFactory(); Scheduler sched = sf.getScheduler(); System.out.println("--------------- 初始化 -------------------"); Date startTime = DateBuilder.nextGivenSecondDate(null, 10); // job3 將執行11次(執行1次,重複10次) ,每10秒重複一次 JobDetail job = JobBuilder.newJob(SimpleJob.class).withIdentity("job3", "group1").build(); SimpleTrigger trigger = TriggerBuilder.newTrigger() .withIdentity("trigger3", "group1") .startAt(startTime) .withSchedule( SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(3)// 重複間隔 .withRepeatCount(5)) // 重複次數 .build(); Date ft = sched.scheduleJob(job, trigger); System.out.println(job.getKey().getName()+ " 將在 : " + dateFormat.format(ft) + " 時運行.而且重複: " + trigger.getRepeatCount() + " 次, 每次間隔 " + trigger.getRepeatInterval() / 1000 + " 秒"); sched.start(); System.out.println("------- 開始調度 (調用.start()方法) ----------------"); System.out.println("-------系統 啓動 的 時間 :" + dateFormat.format(new Date())); // 在 scheduled.start(); 以後,還能夠將 jobs 添加到執行計劃中 // job7 將重複20次 ,每5分鐘重複一次 job = JobBuilder.newJob(SimpleJob.class).withIdentity("job7", "group1").build(); trigger = TriggerBuilder.newTrigger() .withIdentity("trigger7", "group1") .startAt(startTime) .withSchedule( SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(5) // 5分鐘 .withRepeatCount(3)) // 重複20次 .build(); ft = sched.scheduleJob(job, trigger); System.out.println(job.getKey().getName() + " 將在 : " + dateFormat.format(ft) + " 時運行.而且重複: " + trigger.getRepeatCount() + " 次, 每次間隔 " + trigger.getRepeatInterval() / 1000 + " 秒"); // job8 能夠當即執行. 無trigger註冊 job = JobBuilder.newJob(SimpleJob.class).withIdentity("job8", "group1") .storeDurably().build(); sched.addJob(job, true); System.out.println("手動觸發 job8...(當即執行)"); sched.triggerJob(JobKey.jobKey("job8", "group1")); Thread.sleep(20*1000L); // 顯示一下 已經執行的任務信息 SchedulerMetaData metaData = sched.getMetaData(); System.out.println("~~~~~~~~~~ 執行了 " + metaData.getNumberOfJobsExecuted() + " 個 jobs."); } }
從新安排觸發器
package net.itaem.annnodemo.anno.task.task1; import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; import java.text.SimpleDateFormat; import java.util.Date; /** * Created with IntelliJ IDEA. * Description: * User: zhubo * Date: 2017-10-24 * Time: 16:04 */ public class ReInject { public static void main(String[] args) throws Exception { new ReInject().run(); } public void run() throws Exception { // 日期格式化 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy 年 MM 月 dd 日 HH 時 mm 分 ss 秒"); SchedulerFactory sf = new StdSchedulerFactory(); Scheduler sched = sf.getScheduler(); System.out.println("--------------- 初始化 -------------------"); Date startTime = DateBuilder.nextGivenSecondDate(null, 10); sched.start(); JobDetail job = JobBuilder.newJob(SimpleJob.class).withIdentity("job7", "group1").build(); SimpleTrigger trigger = TriggerBuilder.newTrigger() .withIdentity("trigger7", "group1") .startAt(startTime) .withSchedule( SimpleScheduleBuilder.simpleSchedule() .withIntervalInMinutes(5) // 5分鐘 .withRepeatCount(20)) // 重複20次 .build(); Date ft = sched.scheduleJob(job, trigger); System.out.println(job.getKey().getName() + " 將在 : " + dateFormat.format(ft) + " 時運行.而且重複: " + trigger.getRepeatCount() + " 次, 每次間隔 " + trigger.getRepeatInterval() / 1000 + " 秒"); // job7 將立刻執行,重複10次,每秒一次 System.out.println("------- 從新安排 ... --------------------"); trigger = TriggerBuilder.newTrigger() .withIdentity("trigger7", "group1") .startAt(startTime) .withSchedule( SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5) .withRepeatCount(5)).build(); ft = sched.rescheduleJob(trigger.getKey(), trigger); System.out.println("job7 被從新安排 在 : " + dateFormat.format(ft) +" 執行. \r 當前時間 :" + dateFormat.format(new Date())+"預約執行時間已過,任務當即執行"); } }
幾點說明:
1 DateBuilder.nextGivenSecondDate 的意思代碼中已經說明了,就是下一個你想要的時間,不懂的能夠本身測試一下
2 同一個任務能夠屢次註冊.
3 重複執行 須要設置
trigger = newTrigger()
.withIdentity("trigger3", "group1")
.startAt(startTime)
.withSchedule(
simpleSchedule()
.withIntervalInSeconds(10)// 重複間隔
.withRepeatCount(10)) // 重複次數
.build();
若是須要一直重複:
trigger = newTrigger()
.withIdentity("trigger6", "group1")
.startAt(startTime)
.withSchedule(
simpleSchedule().withIntervalInSeconds(40)
.repeatForever()).build();
4 無trigger註冊,表示任務當即執行 : sched.addJob(job, true);
5 // 在scheduler.start以後調用,能夠在job開始後從新定義trigger,而後從新註冊
sched.rescheduleJob(trigger.getKey(), trigger);
這個Example 仍是比較簡單的,主要 就是Trigger的參數設置,多看看代碼,裏面有註釋的 0.0
本身動手試試吧