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

關於定時任務的操做方法,java語言自己具備 Timer 來解決,但Timer 做用起來不是特別的舒服,因爲項目的須要,使用了Quartz 這個調度框架,現把學習過程記錄下來,方便之後查閱.java

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

附幾個鏈接:數據庫

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

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

-----------------------------------------我是分割線----------------------------------學習

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

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

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

    解壓quartz-2.1.6.tar.gz .code

    目錄結構簡單的介紹下:

    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分配的線程池啓動的其餘線程完成的,並不在主線程之中

相關文章
相關標籤/搜索