作業調度框架 Quartz 學習筆記(二) -- 簡單觸發器(SimpleTrigger)

簡單回顧一下上一節學習到的 "HelloWorld "

1 創建一個job類,實現Job接口,覆蓋 public void execute(JobExecutionContext context) 方法,在方法中寫入你要執行的操作(數據導入/備份,輪詢檢查文件等)代碼

2 創建一個主線程類, 獲得 Scheduler 對象

    SchedulerFactory sf = new StdSchedulerFactory();
    Scheduler sched = sf.getScheduler(); 

    獲得要執行的對象  JobDetail job = newJob(HelloJob.class).withIdentity("job1", "group1").build();

    定義觸發器 Trigger trigger = newTrigger().withIdentity("trigger1", "group1").startAt(runTime).build();

    將任務和Trigger放入scheduler   : 

        sched.scheduleJob(job, trigger);

    啓動 和 停止
    sched.start();  sched.shutdown(true);

    注意 給job 留有足夠長的時間,如果主線程類停止工作,job線程也會停止工作

 

------------------------------------------------我是分割線--------------------------------------------------------

經過了 "HelloWorld" 之後,您老人家可能對 Quartz 有所瞭解,下面讓我們繼續深入,學習下Quartz 重複執行任務該怎麼做

簡單的說就是 觸發器(Trigger)的參數設置. 什麼? 觸發器(Trigger)不知道是什麼?

出門左轉  <<作業調度框架 Quartz 學習筆記(一)>>    不謝

還是老套路,一個job 類,一個主線程類

SimpleJob.java

[java] view plaincopy
  1. public class SimpleJob implements Job {  
  2.   
  3.     @Override  
  4.     public void execute(JobExecutionContext context)  
  5.             throws JobExecutionException {  
  6.         // job 的名字  
  7.         String jobName = context.getJobDetail().getKey().getName();  
  8.           
  9.         // 任務執行的時間  
  10.         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy 年 MM 月 dd 日  HH 時 mm 分 ss 秒");  
  11.         String jobRunTime = dateFormat.format(Calendar.getInstance().getTime());  
  12.           
  13.         // 輸出任務執行情況  
  14.         System.out.println("任務 : " + jobName + " 在  " +jobRunTime + " 執行了 ");  
  15.     }  
  16. }  

在這裏 對輸出 的日期進行了一小下 格式化,適應國人習慣.

其它沒什麼好說的 0.0

 

SimpleTriggerExample.java

[java] view plaincopy
  1. import static org.quartz.DateBuilder.futureDate;  
  2. import static org.quartz.JobBuilder.newJob;  
  3. import static org.quartz.JobKey.jobKey;  
  4. import static org.quartz.SimpleScheduleBuilder.simpleSchedule;  
  5. import static org.quartz.TriggerBuilder.newTrigger;  
  6.   
  7. import java.text.SimpleDateFormat;  
  8. import java.util.Date;  
  9.   
  10. import org.quartz.DateBuilder;  
  11. import org.quartz.DateBuilder.IntervalUnit;  
  12. import org.quartz.JobDetail;  
  13. import org.quartz.Scheduler;  
  14. import org.quartz.SchedulerFactory;  
  15. import org.quartz.SchedulerMetaData;  
  16. import org.quartz.SimpleTrigger;  
  17. import org.quartz.impl.StdSchedulerFactory;  
  18.   
  19. /** 
  20.  * Simple Triggers (簡單觸發器) 的使用. 
  21.  */  
  22. public class SimpleTriggerExample {  
  23.   
  24.     public static void main(String[] args) throws Exception {  
  25.         SimpleTriggerExample example = new SimpleTriggerExample();  
  26.         example.run();  
  27.     }  
  28.   
  29.     public void run() throws Exception {  
  30.         // 日期格式化  
  31.         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy 年 MM 月 dd 日  HH 時 mm 分 ss 秒");  
  32.           
  33.         SchedulerFactory sf = new StdSchedulerFactory();  
  34.         Scheduler sched = sf.getScheduler();  
  35.         System.out.println("--------------- 初始化 -------------------");  
  36.   
  37.         // 下一個第15秒 例:  
  38.         //           當前 10秒,則 執行時間爲15秒  
  39.         //           當前 16秒,則 執行時間爲30秒  
  40.         //           當前 33秒,則 執行時間爲45秒  
  41.         //           當前 48秒,則 執行時間爲00秒  
  42.         Date startTime = DateBuilder.nextGivenSecondDate(null15);  
  43.   
  44.         // job1 將只會執行一次   
  45.         JobDetail job = newJob(SimpleJob.class).withIdentity("job1""group1").build();  
  46.         SimpleTrigger trigger = (SimpleTrigger) newTrigger()  
  47.                 .withIdentity("trigger1""group1")  
  48.                 .startAt(startTime).build();  
  49.         // 把job1 和 trigger加入計劃   .  ft:此任務要執行的時間  
  50.         Date ft = sched.scheduleJob(job, trigger);  
  51.         System.out.println(job.getKey().getName() + " 將在 : " + dateFormat.format(ft) + " 時運行.並且重複: "  
  52.                 + trigger.getRepeatCount() + " 次, 每次間隔 "  
  53.                 + trigger.getRepeatInterval() / 1000 + " 秒");  
  54.   
  55.         // job2 將只會和執行一次(和job1一樣一樣的,吼~~)  
  56.         job = newJob(SimpleJob.class).withIdentity("job2""group1").build();  
  57.         trigger = (SimpleTrigger) newTrigger()  
  58.                 .withIdentity("trigger2""group1").startAt(startTime).build();  
  59.         ft = sched.scheduleJob(job, trigger);  
  60.         System.out.println(job.getKey().getName() + " 將在 : " + dateFormat.format(ft) + " 時運行.並且重複: "  
  61.                 + trigger.getRepeatCount() + " 次, 每次間隔 "  
  62.                 + trigger.getRepeatInterval() / 1000 + " 秒");  
  63.   
  64.         // job3 將執行11次(執行1次,重複10次) ,每10秒重複一次  
  65.         job = newJob(SimpleJob.class).withIdentity("job3""group1").build();  
  66.         trigger = newTrigger()  
  67.                 .withIdentity("trigger3""group1")  
  68.                 .startAt(startTime)  
  69.                 .withSchedule(  
  70.                         simpleSchedule()  
  71.                         .withIntervalInSeconds(10)// 重複間隔  
  72.                         .withRepeatCount(10))     // 重複次數  
  73.                         .build();  
  74.         ft = sched.scheduleJob(job, trigger);  
  75.         System.out.println(job.getKey().getName()+ " 將在 : " + dateFormat.format(ft) + " 時運行.並且重複: "  
  76.                 + trigger.getRepeatCount() + " 次, 每次間隔 "  
  77.                 + trigger.getRepeatInterval() / 1000 + " 秒");  
  78.   
  79.           
  80.         // trigger3 改變了.  每隔10s重複.共重複2次  
  81.         // 此處說明 , 上面job3已經 設定了 trigger3 重複10次,每次10s  
  82.         //        在這裏又改變了 trigger3的設置,不會對以前構成影響,而是當做一個新的來處理  
  83.         trigger = newTrigger()  
  84.                 .withIdentity("trigger3""group2")  
  85.                 .startAt(startTime)  
  86.                 .withSchedule(  
  87.                         simpleSchedule()  
  88.                         .withIntervalInSeconds(10)  
  89.                         .withRepeatCount(2))  
  90.                         .forJob(job).build();  
  91.         ft = sched.scheduleJob(trigger);  
  92.         System.out.println(job.getKey().getName() + " 改變過trigger3屬性的job3 : " + dateFormat.format(ft) + " 時運行.並且重複: "  
  93.                 + trigger.getRepeatCount() + " 次, 每次間隔 "  
  94.                 + trigger.getRepeatInterval() / 1000 + " 秒");  
  95.   
  96.         // job5 將在5分鐘後運行一次  
  97.         job = newJob(SimpleJob.class).withIdentity("job5""group1").build();  
  98.         trigger = (SimpleTrigger) newTrigger()  
  99.                 .withIdentity("trigger5""group1")  
  100.                 .startAt(futureDate(5, IntervalUnit.MINUTE)) // 設定5分鐘後運行  
  101.                 .build();  
  102.         ft = sched.scheduleJob(job, trigger);  
  103.         System.out.println(job.getKey().getName()+ " 將在 : " + dateFormat.format(ft) + " 時運行.並且重複: "  
  104.                 + trigger.getRepeatCount() + " 次, 每次間隔 "  
  105.                 + trigger.getRepeatInterval() / 1000 + " 秒");  
  106.   
  107.         // job6  每40s運行一次,沒有指定重複次數,則無下限的重複  
  108.         job = newJob(SimpleJob.class).withIdentity("job6""group1").build();  
  109.         trigger = newTrigger()  
  110.                 .withIdentity("trigger6""group1")  
  111.                 .startAt(startTime)  
  112.                 .withSchedule(  
  113.                         simpleSchedule().withIntervalInSeconds(40)  
  114.                                 .repeatForever()).build();  
  115.         ft = sched.scheduleJob(job, trigger);  
  116.         System.out.println(job.getKey().getName() + " 將在 : " + dateFormat.format(ft) + " 時運行.並且重複: "  
  117.                 + trigger.getRepeatCount() + " 次, 每次間隔 "  
  118.                 + trigger.getRepeatInterval() / 1000 + " 秒");  
  119.   
  120.         // 所有的任務都被加入到了 scheduler中 ,但只有 schedulers.start(); 時纔開始執行  
  121.         sched.start();  
  122.         System.out.println("------- 開始調度 (調用.start()方法) ----------------");  
  123.         System.out.println("-------系統 啓動 的 時間 :" + dateFormat.format(new Date()));  
  124.   
  125.         // 在 scheduled.start(); 之後,還可以將 jobs 添加到執行計劃中  
  126.         // job7 將重複20次 ,每5分鐘重複一次  
  127.         job = newJob(SimpleJob.class).withIdentity("job7""group1").build();  
  128.         trigger = newTrigger()  
  129.                 .withIdentity("trigger7""group1")  
  130.                 .startAt(startTime)  
  131.                 .withSchedule(  
  132.                         simpleSchedule()  
  133.                         .withIntervalInMinutes(5// 5分鐘   
  134.                         .withRepeatCount(20))     // 重複20次  
  135.                         .build();  
  136.         ft = sched.scheduleJob(job, trigger);  
  137.         System.out.println(job.getKey().getName() + " 將在 : " + dateFormat.format(ft) + " 時運行.並且重複: "  
  138.                 + trigger.getRepeatCount() + " 次, 每次間隔 "  
  139.                 + trigger.getRepeatInterval() / 1000 + " 秒");  
  140.   
  141.         // job8  可以立即執行. 無trigger註冊  
  142.         job = newJob(SimpleJob.class).withIdentity("job8""group1")  
  143.                 .storeDurably().build();  
  144.         sched.addJob(job, true);  
  145.         System.out.println("手動觸發  job8...(立即執行)");  
  146.         sched.triggerJob(jobKey("job8""group1"));  
  147.   
  148.         System.out.println("------- 等待30 秒... --------------");  
  149.   
  150.         try {  
  151.             Thread.sleep(30L * 1000L);  
  152.         } catch (Exception e) { }  
  153.   
  154.         // job7 將馬上執行,重複10次,每秒一次  
  155.         System.out.println("-------  重新安排 ... --------------------");  
  156.         trigger = newTrigger()  
  157.                 .withIdentity("trigger7""group1")  
  158.                 .startAt(startTime)  
  159.                 .withSchedule(  
  160.                         simpleSchedule().withIntervalInMinutes(5)  
  161.                                 .withRepeatCount(20)).build();  
  162.   
  163.         ft = sched.rescheduleJob(trigger.getKey(), trigger);  
  164.         System.out.println("job7 被重新安排 在 : " + dateFormat.format(ft) +"  執行. \r   當前時間 :" + dateFormat.format(new Date())+"預定執行時間已過,任務立即執行");  
  165.           
  166.         try {  
  167.             System.out.println("------- 等待5分鐘  ... ------------");  
  168.             Thread.sleep(300L * 1000L);  
  169.         } catch (Exception e) { }  
  170.   
  171.         sched.shutdown(true);  
  172.         System.out.println("------- 調度已關閉 ---------------------");  
  173.   
  174.         // 顯示一下  已經執行的任務信息  
  175.         SchedulerMetaData metaData = sched.getMetaData();  
  176.         System.out.println("~~~~~~~~~~  執行了 " + metaData.getNumberOfJobsExecuted() + " 個 jobs.");  
  177.   
  178.     }  
  179.   
  180. }  

幾點說明:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章