關於定時任務的操作方法,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
- import java.util.Date;
- import org.quartz.Job;
- import org.quartz.JobExecutionContext;
- public class HelloJob implements Job {
- /**
- * 實現你自己的定時方法 ,至於裏面寫什麼,您說了蒜!<br>
- * 這裏只輸出 HelloWorld!
- */
- @Override
- public void execute(JobExecutionContext context){
- // 輸出 HelloWorld !
- System.out.println("Hello World! - " + new Date());
- }
- }
任務很簡單,HelloJob 實現了Quartz 的Job接口中的execute方法,任務的內容就是打印一行字。具體這個任務應該何時去執行,都在SimpleExample.java裏面去定義實現。
SimpleExample.java
- import static org.quartz.DateBuilder.evenMinuteDate;
- import static org.quartz.JobBuilder.newJob;
- import static org.quartz.TriggerBuilder.newTrigger;
- import java.util.Date;
- import org.quartz.JobDetail;
- import org.quartz.Scheduler;
- import org.quartz.SchedulerFactory;
- import org.quartz.Trigger;
- import org.quartz.impl.StdSchedulerFactory;
- /**
- * 這外例子說明了如何開始和關閉一個 Quartz scheduler
- * 及如何運行一個任務
- */
- public class SimpleExample {
- public void run() throws Exception {
- System.out.println("------- 初始化 獲得 Scheduler 對象 -------------");
- // 獲得 Scheduler 對象
- SchedulerFactory sf = new StdSchedulerFactory();
- Scheduler sched = sf.getScheduler();
- // 獲取下一分鐘,即當前時間的下一分鐘
- Date runTime = evenMinuteDate(new Date());
- // 定義一個 job 對象並綁定我們寫的 HelloJob 類
- // 真正執行的任務並不是Job接口的實例,而是用反射的方式實例化的一個JobDetail實例
- JobDetail job = newJob(HelloJob.class).withIdentity("job1", "group1").build();
- // 定義一個觸發器,startAt方法定義了任務應當開始的時間 .即下一個整數分鐘執行
- Trigger trigger = newTrigger().withIdentity("trigger1", "group1").startAt(runTime).build();
- // 將任務和Trigger放入scheduler
- sched.scheduleJob(job, trigger);
- System.out.println(job.getKey() + " 將在: " + runTime +" 運行");
- // 啓動
- sched.start();
- System.out.println("------- 任務調度已經啓動 -----------------");
- System.out.println("------- 等待 65 秒,保證下一個整數分鐘出現 ... ---");
- try {
- // 等待65秒,保證下一個整數分鐘出現,這裏注意,如果主線程停止,任務是不會執行的
- Thread.sleep(65L * 1000L);
- } catch (Exception e) { }
- // 關閉 scheduler
- sched.shutdown(true);
- System.out.println("------- 調度已關閉 ---------------------");
- }
- public static void main(String[] args) throws Exception {
- SimpleExample example = new SimpleExample();
- example.run();
- }
- }
通過代碼可以看到幾個重要的類:
•JobDetail: 真正的任務內容,任務本身是集成Job接口的,但是真正的任務是JobBuilder通過反射的方式實例化的,
•Trigger: 觸發器,定義任務應當開始的時間,主要分爲兩類SimpleTrigger,CronTrigger,當前例子的就是簡單觸發器,CronTrigger主要用於處理quartz表達式定義的任務,比如每個月20號,每個星期一之類的。
•Scheduler: 計劃執行者,現在我們有了要做的內容(HelloJob),有了要做的時間(下一分鐘),接下來,就把這兩個內容填充到計劃任務Scheduler對象裏面,到了時間它就可以自動運行了
注:任務的完成是quartz爲Scheduler分配的線程池啓動的其他線程完成的,並不在主線程之中
至此, Quartz 的HelloWorld 完結! 很簡單吧,後續會逐步深入學習Quartz的更多內容,敬請關注!!!