1. 程式人生 > >Quartz入門例子簡介 從入門到菜鳥(一)

Quartz入門例子簡介 從入門到菜鳥(一)

剛接觸quartz這個詞並不是在學習過程中。。。而是WOW裡面的介面外掛。。。 汗=。=

言歸正傳,入門教程,不喜勿噴。 

網上看到一些定時任務使用Timer來解決,但是在多工的情況下可能會造成延遲嚴重,並且Timer不提供實時保證。所以推薦使用Quartz這個定時任務的框架來完成此類功能。相關問題見:http://www.iteye.com/problems/90824,具體原理請google。 

前面用過Quartz的功能,學新工具一般都是先用再寫再看原始碼。其實應用場景很容易想象,比如每個月20號要發工資,資料庫裡面某些欄位要標記為已發,或者要進行記賬之類的,那麼這時候可以用quartz來寫表示式,就可以讓系統自動的在每個月20號執行這些任務。 


接下來就去下載Quartz吧(http://www.quartz-scheduler.org/),我的版本是quartz-2.1.0, 看官網現在最新應該是2.1.6。 

解壓開來,如果要直接用的話,取quartz-all.2.1.0.jar和lib目錄下的那幾個jar包就可以。docs存放Api文件,不再贅述。 

對於那幾個quartz-oracle,jboss幾個包是幹嘛的我還沒細看=。= 後面再說。看readme應該是特殊場景應用吧。聽高人提了下據說oracle裡面的東西是直接呼叫orcl資料庫底層的XXX,就是不採用Sql,增加效率什麼的,待考證

對於我這種當前剛開始使用入門的話可以看examples裡面的例子,目錄:examples\src\main\java,裡面包含了15個例子,從最簡單的任務呼叫,到表示式、引數傳遞,再到。。。(後面的還沒看..) 


其實一般來說 前幾個,應該夠用了。(LZ當前看到第四個) 

最簡單的應用包含兩個類: 
MyJob.java:定義任務(需要是public) 
QuartzTest.java:主執行緒,用於呼叫任務。 

這個例子的目的是在當前執行時間的下一個整數分鐘輸出一行文字 

MyJob: 
Java程式碼  收藏程式碼
  1. public class MyJob implements Job {  
  2.     @Override  
  3.     public void execute(JobExecutionContext context) throws JobExecutionException {  
  4.         System.out.println("任務正在執行,執行時間: "
     + Calendar.getInstance().getTime());  
  5.     }  
  6. }  


可以看到,任務很簡單,MyJob 實現了Quartz的Job介面中的execute方法,任務的內容就是列印一行字。具體這個任務應該何時去執行,都在QuartzTest裡面去定義實現。 

QuartzTest: 

Java程式碼  收藏程式碼
  1. public static void main(String[] args) throws Throwable {  
  2.         SchedulerFactory factory = new StdSchedulerFactory();  
  3.         // 從工廠裡面拿到一個scheduler例項  
  4.         Scheduler scheduler = factory.getScheduler();  
  5.         // 計算任務的開始時間,DateBuilder.evenMinuteDate方法是取下一個整數分鐘  
  6.         Date runTime = DateBuilder.evenMinuteDate(new Date());  
  7.         // 真正執行的任務並不是Job介面的例項,而是用反射的方式例項化的一個JobDetail例項  
  8.         JobDetail job = JobBuilder.newJob(MyJob.class).withIdentity("job1""group1").build();  
  9.         // 定義一個觸發器,startAt方法定義了任務應當開始的時間  
  10.         Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1""group1").startAt(runTime).build();  
  11.         // 將任務和Trigger放入scheduler  
  12.         scheduler.scheduleJob(job, trigger);  
  13.         scheduler.start();  
  14.         try {  
  15.             // 等待65秒,保證下一個整數分鐘出現,這裡注意,如果主執行緒停止,任務是不會執行的  
  16.             Thread.sleep(65L * 1000L);  
  17.         } catch (Exception e) {  
  18.         }  
  19.         // scheduler結束  
  20.         scheduler.shutdown(true);  
  21.     }  


通過程式碼可以看到幾個重要的類: 
  • JobDetail: 真正的任務內容,任務本身是整合Job介面的,但是真正的任務是JobBuilder通過反射的方式例項化的,
  • Trigger: 觸發器,定義任務應當開始的時間,主要分為兩類SimpleTrigger,CronTrigger,當前例子的就是簡單觸發器,CronTrigger主要用於處理quartz表示式定義的任務,比如每個月20號,每個星期一之類的。
  • Scheduler: 計劃表(可能翻譯的不太貼切),現在我們有了要做的內容,有了要做的時間,接下來,就把這兩個內容填充到計劃任務Scheduler物件裡面,到了時間它就可以自動運行了。


理解了這三個重要類,其餘的就比較好理解了,主要是提供服務的工具類或工廠類如 
DateBuilder:處理時間 
TriggerBuilder,JobBuilder。 

任務的完成是quartz為Scheduler分配的執行緒池啟動的其他執行緒完成的,並不在主執行緒之中,具體的執行詳細過程將在後續部落格中撰寫。 

後續將介紹CronTrigger,引數傳遞等內容。