Quartz學習(一)--初始Quartz

  一、什麼是Quartz

     1、quartz是一個作業調度系統(a job scheduling system),不但可以集成到其他軟件系統中,而且還可以獨立運行

     2、Quartz是OpenSymphony開源組織在Job scheduling領域又一個開源項目,它可以與J2EE與J2SE應用程序相結合也可以單獨使用。Quartz可以用來創建簡單或爲運行十個,百個,甚至是好幾萬個Jobs這樣複雜的日程序表。Jobs可以做成標準的Java組件或 EJBs。
     3、Quartz是一個任務日程管理系統,一個在預先確定(被納入日程)的時間到達時,負責執行(或者通知)其他軟件組件的系統。藉助於cron表達式,他可以執行各種複雜的任務調度雖然JDK爲簡單任務調度提供了Timer支持,但對於更復雜的調度,如:在某個特定的時刻調度任務,Timer就力不從心了
     4、Quartz用一個小Java庫發佈文件(.jar文件),這個庫文件包含了所有Quartz核心功能。這些功能的主要接口(API)是Scheduler接口。它提供了簡單的操作,例如:將任務納入日程或者從日程中取消,開始/停止/暫停日程進度。


  二、下載和安裝Quartz

    1、Quartz的下載:http://www.quartz-scheduler.org/   (只有註冊用戶才能下載)

    下載完成,將得到quartz-2.1.6.tar.gz,解壓後得到的目錄結構是:

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

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

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

    quartz : 源碼

    …………

    quartz-all-2.1.6.jar : 打好的 jar 包,將其放入工程的classpath路徑下即可

  三、javaSE中使用Quartz步驟

    1、將quartz-all-2.1.6.jar或者quartz-2.1.6.jar添加到classpath路徑下。

      (實際上Quartz還是用SLF4J作爲日誌工具,因此還需要將slf4j-api-2.1.6.jar導入到類路徑下

   2、配置quartz運行環境的基本屬性文件:quartz.properties  (放在類路徑下即可)

# 配置主調度器屬性
org.quartz.scheduler.instanceName=QuartzScheduler
org.quartz.scheduler.instanceId=AUTO
# 配置線程池
# Quartz線程池的實現類
org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
# 線程池的線程數量
org.quartz.threadPool.threadCount=1
# 線程池裏線程的優先級
org.quartz.threadPool.threadPriority=10
# 配置作業存儲
org.quartz.jobStore.misfireThreshold=60000
org.quartz.jobStore.class=org.quartz.simpl.RAMJobStore

如果我們不配置此文件的話,默認使用quartz-2.1.6.jar中的quartz.properties文件(在該壓縮文件的org/quartz路徑下),如果需要改變其運行屬性,我們可以自己創建一個quartz.properties文件,並將該文件放在系統加載的類路徑下,ClassLoader就會自動加載並啓用其中的各種屬性

  3、創建quartz作業類

    該類須實現org.quartz.Jog接口,該接口只有一個execute()方法,當quartz調度改作業運行時,execute()方法就會執行。

package lee;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.util.*;
public class TestJob
	implements Job
{
	//判斷作業是否執行的旗標
	private boolean isRunning = false;
	public void execute(JobExecutionContext context) 
		throws JobExecutionException
	{
		//如果作業沒有被調度
		if (!isRunning)
		{
			System.out.println(new Date() + "  作業被調度。");
			//循環100次來模擬任務的執行
			for (int i = 0; i < 100 ; i++)
			{
				System.out.println("作業完成" + (i + 1) + "%");
				try
				{
					Thread.sleep(100);
				}
				catch (InterruptedException ex)
				{
					ex.printStackTrace();
				}
			}
			System.out.println(new Date() + "  作業調度結束。");
		}
		//如果作業正在運行,即使獲得調度,也立即退出
		else
		{
			System.out.println(new Date() + "任務退出");
		}
	}
}
 3、創建quartz觸發器

    觸發器用來指定任務被調度的時機。該框架提供了一系列的觸發器,但最常用的的是:SimpleTrigger和CronTrigger。

   SimpleTrigger:主要用於簡單的調度。如在給定的時間內重複執行作業或者間隔固定的時間執行作業。類似於JDK提供的Timer。

   CronTrigger:用於執行更復雜的調度。該調度器基於Calendar—Like和Unix Corn的表達式。

  如:   //創建trigger,創建一個簡單的調度器
        //指定該任務被重複調度50次,每次間隔2秒
        Trigger trigger = new SimpleTrigger("dd" ,
        Scheduler.DEFAULT_GROUP, 50, 20000) ;

   4、創建quartz調度器

    調度器用於將任務和觸發器管理起來,任務和觸發器是多對多的關係:當一個任務關聯多個觸發器時,每個觸發器被激發時,這個任務都會被調度一次;當一個觸發器控制多個任務時,此觸發器被觸發時,所有關聯到給觸發器的任務都將被調度。

   quartz調度器由Schedule接口體現。該接口聲明如下方法:

   a:void addJob(JobDetail d,boolean replace):將jobDetail實例添加到調度器。

   b:Date scheduleJob(JobDetail d,Trigger t):使用Trigger來控制JobDetail實例。

   c:Date scheduleJob(Trigger t):添加觸發器t來調度作業。

        

package lee;

import org.quartz.Scheduler;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.JobDetail;
import org.quartz.SchedulerException;
import org.quartz.SimpleTrigger;
public class MyQuartzServer
{
	public static void main(String[] args)
	{
		MyQuartzServer server = new MyQuartzServer();
		try
		{
			server.startScheduler();
		}
		catch (SchedulerException ex)
		{
			ex.printStackTrace();
		}
	}
	//執行調度
	private void startScheduler() throws SchedulerException 
	{
		//使用工廠創建調度器實例
		Scheduler scheduler = StdSchedulerFactory
			.getDefaultScheduler(); 
		//以作業創建JobDetail實例
		JobDetail jobDetail = new JobDetail("dd", 
			Scheduler.DEFAULT_GROUP , TestJob.class);
		//創建trigger,創建一個簡單的調度器
		//指定該任務被重複調度50次,每次間隔2秒
		Trigger trigger = new SimpleTrigger("dd" , 
			Scheduler.DEFAULT_GROUP, 50, 20000) ;
		//調度器將作業與trigger關聯起來
		scheduler.scheduleJob(jobDetail, trigger ); 
		//開始調度
		scheduler.start();
	}
}



發佈了27 篇原創文章 · 獲贊 22 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章