最近在工做中,要作定時任務的更能,最開始的時候,想到的是 JavaSE 中,自帶 Timer 及 TimerTask 聯合使用,完成定時任務。最後發現,隨着業務的複雜,JDK 中的 Timer 和 TimerTask 並不能簡單、靈活的完成定時任務的操做。因而,便學習了任務調度框架-- Quartz。在最初的學習中,網上的例子大多數是基於 quartz-2.0.0 以前的版本,可是發現,2.0.0以前的版本和 2.0.0以後的變化仍是比較大的,網上給出的例子及方法,都不適用了。最後,在學習了 quartz-2.1.7 以後,大體瞭解了下相關的方法。現分享出來,以供學習。java
此次大概會寫到的東西,以下圖:apache
。框架
第一個簡單的任務調度實例以下:ide
首先是自定義本身的做業類,而後是開始任務調度操做。具體的使用方法,以下代碼:性能
(1)自定義的做業類學習
/** 0.0.0.1 */ package com.gaoqing.common.quartz; import java.text.SimpleDateFormat; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; /** * 自定義做業類 * @author 高青 * 2014-3-23 */ public class MyJob implements Job{ /** * 2014-3-23 */ public MyJob() { } @Override public void execute(JobExecutionContext context) throws JobExecutionException { //獲得當前做業的名稱 String jobName = context.getJobDetail().getJobDataMap().getString("name"); System.out.println( "當前做業開始執行了,做業的名稱爲:" + jobName + ",做業的時間是:" + new SimpleDateFormat("yyyy-MM-dd").format(new Date()) ); } }
做業類中的邏輯就是,取出任務調度器中註冊的 JobDetail 的名稱。測試
(2)具體的任務調度操做以下:ui
/** 0.0.0.1 */ package com.gaoqing.common.quartz; import java.util.Date; import org.apache.log4j.Logger; import org.quartz.JobBuilder; import org.quartz.JobDataMap; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SimpleScheduleBuilder; import org.quartz.SimpleTrigger; import org.quartz.TriggerBuilder; import org.quartz.TriggerKey; import org.quartz.impl.StdSchedulerFactory; /** * 簡單任務調度測試類 * @author 高青 * 2014-3-20 */ public class SimpleQuartzTest{ /** 日誌對象 */ private static Logger log = Logger.getLogger(SimpleQuartzTest.class); /** * 2014-3-20 */ public SimpleQuartzTest() { } /** * 主線程方法 * author 高青 * 2014-3-20 * @param args 參數字符串集 * @return void 空 * @throws SchedulerException 調度器異常 */ public static void main(String[] args) throws SchedulerException { //獲得一個默認的調度器 Scheduler defaultScheduler = StdSchedulerFactory.getDefaultScheduler(); //獲得具體的和指定做業相關的 JobDetail 對象 JobDetail jobDetail = JobBuilder. //2.0.0以後,JobDetail 變成了接口,不能用以前的 new JobDetail()來實例了,如今要經過相應的做業建造器來管理生成 newJob(MyJob.class). withIdentity("myFirstJob", "firstJob"). build(); //要調用建造器的 build()方法,才能實例當前做業的具體做業對象 //獲得做業的參數對象 JobDataMap jobDataMap = jobDetail.getJobDataMap(); //能夠向做業數據對象中,存放本身須要的數據,在本身實現的 Job 類中,能夠經過 context 獲得相應的參數,以便作業務處理 jobDataMap.put("myFirstJob", "first"); jobDataMap.put("name", "myFirstJob"); //實例化觸發器對象(定義執行的時間和執行的週期) SimpleTrigger simpleTrigger = TriggerBuilder.newTrigger(). //同上,觸發器的也須要相應的建造器來實例化觸發器,如今的 Trigger 也是接口,不能經過 new Trigger() 來實例化了 withIdentity(TriggerKey.triggerKey("myFirstTigger", "myFirstGroup")). withSchedule( //在獲得對應的 SimpleTrigger 時,須要經過觸發器建造器的 widthSchedule()方法,建造對應的觸發器 SimpleScheduleBuilder. simpleSchedule(). repeatForever(). withIntervalInSeconds(5) ). startAt(new Date()). build(); //添加調度做業(將具體的做業和觸發器添加到做業中) defaultScheduler.scheduleJob(jobDetail, simpleTrigger); //執行調度任務 defaultScheduler.start(); } }
上面就是一個簡單的任務調度的實現,和以前的版本相比,變化仍是挺大了,我的感受後面的版本更強調了性能和多任務處理。本文主要旨在實用,並不講解大量的理論,理論在網上都是能夠搜到的。但願本身的一點點分享,能對他人有一點點的幫助。下一篇,將寫一個簡單的任務調度實例,使用更能強大的 CronTrigger 觸發器來實現任務調度功能。spa