Quartz作業調度,不再讓我們煩惱

✪  前言

         你曾經需要應用執行一個任務嗎?這個任務每天或每週星期二晚上11:30,或許僅僅每個月的最後一天執行。一個自動執行而無須干預的任務在執行過程中如果發生一個嚴重錯誤,應用能夠知到其執行失敗並嘗試重新執行嗎?你和你的團隊是用java編程嗎?如果這些問題中任何一個你回答是,那麼你應該使用Quartz調度器。旁註:Matrix目前就大量使用到了Quartz。比如,排名統計功能的實現,在Jmatrix裏通過Quartz定義了一個定時調度作業,在每天凌晨一點,作業開始工作,重新統計大家的Karma和排名等。還有,RSS文件的生成,也是通過Quartz定義作業,每隔半個小時生成一次RSS XML文件。

✪  Quartz發展介紹

        和現在許多的開源項目一樣,Quartz在創立之初只是爲個人開發者提供一個簡單的實現方案,但是隨着日益增多的人員參與和貢獻,Quartz開始成爲衆所周知,並且能幫助IT攻城獅解決大問題的一個框架!

        在1998年最初的構思中,Quartz 包括作業隊列的概念,使用線程池 處理作業。在接下來的數年中,James House 一直在關注着一個目標:一個靈活的作業調度工具;帶着有限的選擇和濃厚的興趣,James House 終於在2001年春天,創立了該項目:http://sourceforge.net/projects/quartz,雖然項目仍然有效,但是已經不再維護;

✪  Quartz的體系結構

                      

    詳細講解如下:


✪  實例小demo

 新建java project

         導入quartz框架所需的jar包:log4j-1.2.1.jar , quartz-2.1.1.jar, slf4j-api-1.6.1.jar, slf4j-log4j12-1.6.1.jar

        

✎ 在job包下新建兩個類:

          MyJob.java 和 threadTest.java (threadTest.java 類主要是爲了測試 quartz框架支持多線程的情況):

      MyJob.java :

package job;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class MyJob implements Job {

	@Override
	public void execute(JobExecutionContext arg0) throws JobExecutionException {
		System.out.println("quartz定時任務1:" + new Date());
	}
}
       threadTest.java:
<span style="font-size:18px;">package job;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class threadTest implements Job {

	@Override
	public void execute(JobExecutionContext arg0) throws JobExecutionException {
		System.out.println("quartz 定時任務2:" + new Date());
	}
}</span>

✎ 建立一個包,並新建一個java類:TestJob.java

import static org.quartz.CronScheduleBuilder.cronSchedule;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.TriggerBuilder.newTrigger;
import job.MyJob;
import job.threadTest;

import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;


public class TestJob {

	private static Scheduler sched = null;
	/**
	 * @param args
	 * @throws SchedulerException 
	 */
	public static void main(String[] args) throws SchedulerException {
		TestJob t = new TestJob();
		t.useJob();     //啓動 scheduler;
//		t.addJob("myjob1", "1/1 * * ? * *", MyJob.class);//啓動任務,從第一秒開始,每隔1s執行一次MyJob任務
//		t.addJob("myjob1", "1/2 * * ? * *", MyJob.class);//啓動任務,從第一秒開始,每隔2s執行一次MyJob任務
		t.addJob("myjob1", "1/5 * * ? * *", MyJob.class);//啓動任務,從第一秒開始,每隔5s執行一次MyJob任務
		t.addJob("myjob2", "1/5 * * ? * *", threadTest.class);//啓動任務,從第一秒開始,每隔5s執行一次MyJob任務
//		t.deleteJob("myjob1");//停止任務
	}
	
	/**
	 * 啓動Schedule
	 * @throws SchedulerException
	 */
	public void useJob() throws SchedulerException{		
		SchedulerFactory sf = new StdSchedulerFactory();
		 try {
			sched = sf.getScheduler();
			sched.start();
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 任務中添加作業
	 * @param jobName 任務名稱,可以自己命名
	 * @param spaceTime corn表達式,調用的時間,例如“5 * * ? * *”
	 * @param clazz job實現類
	 */
	public void addJob(String jobName,String spaceTime,Class clazz){
		String groupName = jobName;
		JobDetail jobs = newJob(clazz).withIdentity(jobName,groupName).build();
		CronTrigger trigger; 
		try {
			if(sched.isShutdown()){
				sched.start();
			}
			trigger = newTrigger().withIdentity(jobName+groupName, groupName).withSchedule(cronSchedule(spaceTime)).build();
			sched.scheduleJob(jobs, trigger);
		} catch (Exception e) {
			e.printStackTrace();
			new Exception(e);
		} 
	
	}
	
	/**
	 * 在任務中刪除改作業
	 * @param jobName
	 */
	public void deleteJob(String jobName){
		String groupName = jobName;
		try {
			if(sched.isShutdown()){
				sched.start();
			}else{
				JobKey key = new JobKey(jobName,groupName);
				sched.deleteJob(key);
			}
		} catch (SchedulerException e) {
			e.printStackTrace();
			new Exception(e);
		}
	}

}
           這樣,我們就可以將web項目添加到tomcat中,直接運行main()方法,我們會發現console中打印出以下信息:

而決定定時任務執行頻率的是在main方法中 克隆表達式,所以小編將在下一篇博客中

進行具體介紹;到這裏,關於Quartz框架從基本情況到具體使用的總結分享就結束了,

希望能幫到大家!



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