作業調度框架 Quartz 學習筆記(一) -- HelloWorld !!!

關於定時任務的操作方法,java語言本身具有 Timer 來解決,但Timer 作用起來不是特別的舒服,由於項目的需要,使用了Quartz 這個調度框架,現把學習過程記錄下來,方便以後查閱.

本教程是按照Quartz 提供的 15個Example 一步一步深入學習,由於我也是一菜鳥,在學習本教程時,如發現有錯誤之處,請各位大人指點.小弟不勝感激!

附幾個連接:

Timer 的問題:http://www.iteye.com/problems/90824

Quartz的下載:http://www.quartz-scheduler.org/

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

    Quartz的下載看上面的連接,看不懂的,懶的去看的兄弟們,我傳到了網盤上,附贈一點點資料.

        地址:http://pan.baidu.com/share/link?shareid=343136&uk=838886155

    對於java開發的人來說,學習一個東西最好的例子就是"HelloWorld!"(不同意的,磚頭不要飛過來).本次學習使用的版本爲quartz-2.1.6

    解壓quartz-2.1.6.tar.gz .

    目錄結構簡單的介紹下:

    doc :  API  和  各種數據庫的建表sql (納尼?! 還和數據庫有關係.)(⊙_⊙?) Quartz應用到集羣,和持久化作業的時候會用到,先不討論,咱入門先!

    examples : 官方給寫的例子了,也就是我們本次學習的重點

    lib : Quartz 所依賴的jar , 相信你的工程中已經添加了吧 ,主要是 log c3p0 什麼的,自己看看吧

    quartz : 源碼

    …………

    quartz-all-2.1.6.jar : 打好的 jar 包,將其放入工程中

 

需要理解的概念:

 1 觸發器 :觸發器用來告訴調度程序作業什麼時候觸發。框架提供了一把觸發器類型,但兩個最常用的SimpleTrigger 和CronTrigger。

 

HelloWorld!

    一個最簡單的應用包含兩個類:

    HelloJob.java   任務類,需要實現 job 接口,裏面實現了你想要 定時執行的方法

    SimpleExample.java 主線程,用於任務的調度,執行等操作.

上代碼:

   HelloJob.java

[java] view plaincopy
  1. import java.util.Date;  
  2.   
  3. import org.quartz.Job;  
  4. import org.quartz.JobExecutionContext;  
  5.   
  6.       
  7. public class HelloJob implements Job {  
  8.   
  9.     /** 
  10.      * 實現你自己的定時方法 ,至於裏面寫什麼,您說了蒜!<br> 
  11.      * 這裏只輸出 HelloWorld! 
  12.      */  
  13.     @Override  
  14.     public void execute(JobExecutionContext context){  
  15.         // 輸出 HelloWorld !  
  16.         System.out.println("Hello World! - " + new Date());  
  17.     }  
  18.   
  19. }  

任務很簡單,HelloJob 實現了Quartz 的Job接口中的execute方法,任務的內容就是打印一行字。具體這個任務應該何時去執行,都在SimpleExample.java裏面去定義實現。

 

SimpleExample.java

[java] view plaincopy
  1. import static org.quartz.DateBuilder.evenMinuteDate;  
  2. import static org.quartz.JobBuilder.newJob;  
  3. import static org.quartz.TriggerBuilder.newTrigger;  
  4.   
  5. import java.util.Date;  
  6.   
  7. import org.quartz.JobDetail;  
  8. import org.quartz.Scheduler;  
  9. import org.quartz.SchedulerFactory;  
  10. import org.quartz.Trigger;  
  11. import org.quartz.impl.StdSchedulerFactory;  
  12.   
  13. /** 
  14.  * 這外例子說明了如何開始和關閉一個 Quartz scheduler 
  15.  * 及如何運行一個任務  
  16.  */  
  17. public class SimpleExample {  
  18.   
  19.     public void run() throws Exception {  
  20.         System.out.println("------- 初始化 獲得 Scheduler 對象 -------------");  
  21.   
  22.         // 獲得 Scheduler 對象   
  23.         SchedulerFactory sf = new StdSchedulerFactory();  
  24.         Scheduler sched = sf.getScheduler();  
  25.   
  26.         // 獲取下一分鐘,即當前時間的下一分鐘  
  27.         Date runTime = evenMinuteDate(new Date());  
  28.   
  29.         // 定義一個 job 對象並綁定我們寫的  HelloJob 類   
  30.         // 真正執行的任務並不是Job接口的實例,而是用反射的方式實例化的一個JobDetail實例    
  31.         JobDetail job = newJob(HelloJob.class).withIdentity("job1""group1").build();  
  32.   
  33.         // 定義一個觸發器,startAt方法定義了任務應當開始的時間 .即下一個整數分鐘執行  
  34.         Trigger trigger = newTrigger().withIdentity("trigger1""group1").startAt(runTime).build();  
  35.   
  36.         // 將任務和Trigger放入scheduler    
  37.         sched.scheduleJob(job, trigger);  
  38.         System.out.println(job.getKey() + " 將在: " + runTime +" 運行");  
  39.   
  40.         // 啓動  
  41.         sched.start();  
  42.         System.out.println("------- 任務調度已經啓動 -----------------");  
  43.         System.out.println("------- 等待 65 秒,保證下一個整數分鐘出現 ... ---");  
  44.         try {  
  45.             // 等待65秒,保證下一個整數分鐘出現,這裏注意,如果主線程停止,任務是不會執行的    
  46.             Thread.sleep(65L * 1000L);  
  47.         } catch (Exception e) { }  
  48.   
  49.         // 關閉 scheduler  
  50.         sched.shutdown(true);  
  51.         System.out.println("------- 調度已關閉 ---------------------");  
  52.     }  
  53.       
  54.     public static void main(String[] args) throws Exception {  
  55.         SimpleExample example = new SimpleExample();  
  56.         example.run();  
  57.   
  58.     }  
  59.   
  60. }  

 

通過代碼可以看到幾個重要的類: 
JobDetail: 真正的任務內容,任務本身是集成Job接口的,但是真正的任務是JobBuilder通過反射的方式實例化的,
Trigger: 觸發器,定義任務應當開始的時間,主要分爲兩類SimpleTrigger,CronTrigger,當前例子的就是簡單觸發器,CronTrigger主要用於處理quartz表達式定義的任務,比如每個月20號,每個星期一之類的。
Scheduler: 計劃執行者,現在我們有了要做的內容(HelloJob),有了要做的時間(下一分鐘),接下來,就把這兩個內容填充到計劃任務Scheduler對象裏面,到了時間它就可以自動運行了

注:任務的完成是quartz爲Scheduler分配的線程池啓動的其他線程完成的,並不在主線程之中

 

至此, Quartz 的HelloWorld 完結! 很簡單吧,後續會逐步深入學習Quartz的更多內容,敬請關注!!!

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