Quartz入門例子簡介 從入門到菜鳥(一)
阿新 • • 發佈:2019-02-02
剛接觸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程式碼
可以看到,任務很簡單,MyJob 實現了Quartz的Job介面中的execute方法,任務的內容就是列印一行字。具體這個任務應該何時去執行,都在QuartzTest裡面去定義實現。
QuartzTest:
Java程式碼
通過程式碼可以看到幾個重要的類:
理解了這三個重要類,其餘的就比較好理解了,主要是提供服務的工具類或工廠類如
DateBuilder:處理時間
TriggerBuilder,JobBuilder。
任務的完成是quartz為Scheduler分配的執行緒池啟動的其他執行緒完成的,並不在主執行緒之中,具體的執行詳細過程將在後續部落格中撰寫。
後續將介紹CronTrigger,引數傳遞等內容。
言歸正傳,入門教程,不喜勿噴。
網上看到一些定時任務使用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程式碼
- public class MyJob implements Job {
- @Override
- public void execute(JobExecutionContext context) throws JobExecutionException {
-
System.out.println("任務正在執行,執行時間: "
- }
- }
可以看到,任務很簡單,MyJob 實現了Quartz的Job介面中的execute方法,任務的內容就是列印一行字。具體這個任務應該何時去執行,都在QuartzTest裡面去定義實現。
QuartzTest:
Java程式碼
- public static void main(String[] args) throws Throwable {
- SchedulerFactory factory = new StdSchedulerFactory();
- // 從工廠裡面拿到一個scheduler例項
- Scheduler scheduler = factory.getScheduler();
- // 計算任務的開始時間,DateBuilder.evenMinuteDate方法是取下一個整數分鐘
- Date runTime = DateBuilder.evenMinuteDate(new Date());
- // 真正執行的任務並不是Job介面的例項,而是用反射的方式例項化的一個JobDetail例項
- JobDetail job = JobBuilder.newJob(MyJob.class).withIdentity("job1", "group1").build();
- // 定義一個觸發器,startAt方法定義了任務應當開始的時間
- Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").startAt(runTime).build();
- // 將任務和Trigger放入scheduler
- scheduler.scheduleJob(job, trigger);
- scheduler.start();
- try {
- // 等待65秒,保證下一個整數分鐘出現,這裡注意,如果主執行緒停止,任務是不會執行的
- Thread.sleep(65L * 1000L);
- } catch (Exception e) {
- }
- // scheduler結束
- scheduler.shutdown(true);
- }
通過程式碼可以看到幾個重要的類:
- JobDetail: 真正的任務內容,任務本身是整合Job介面的,但是真正的任務是JobBuilder通過反射的方式例項化的,
- Trigger: 觸發器,定義任務應當開始的時間,主要分為兩類SimpleTrigger,CronTrigger,當前例子的就是簡單觸發器,CronTrigger主要用於處理quartz表示式定義的任務,比如每個月20號,每個星期一之類的。
- Scheduler: 計劃表(可能翻譯的不太貼切),現在我們有了要做的內容,有了要做的時間,接下來,就把這兩個內容填充到計劃任務Scheduler物件裡面,到了時間它就可以自動運行了。
理解了這三個重要類,其餘的就比較好理解了,主要是提供服務的工具類或工廠類如
DateBuilder:處理時間
TriggerBuilder,JobBuilder。
任務的完成是quartz為Scheduler分配的執行緒池啟動的其他執行緒完成的,並不在主執行緒之中,具體的執行詳細過程將在後續部落格中撰寫。
後續將介紹CronTrigger,引數傳遞等內容。