Quarz 配置(一) - JobDetail
Quartz是一個開源的作業(yè)調(diào)度框架,完全由java寫的,你能通過它創(chuàng)建簡單或者復(fù)雜的任務(wù)。他能提供巨大的靈活性,但又不犧牲簡單性。
Quartz的核心概念 :調(diào)度器、觸發(fā)器、作業(yè)
調(diào)度器(Scheduler)
Scheduler負責(zé)管理Quartz的運行環(huán)境,Quartz它是基于多線程架構(gòu)的,它啟動的時候會初始化一套線程,這套線程會用來執(zhí)行一些預(yù)置的作業(yè)。
要創(chuàng)建一個作業(yè)并能夠被觸發(fā)調(diào)用,必須在Scheduler上面注冊一個JobDetail和Trigger。
Scheduler提攜了所有Trigger和JobDetail,使它們協(xié)調(diào)工作。這些Trigger和JobDetail通過自身的name和group屬性區(qū)分。
Scheduler 由SchedulerFactory產(chǎn)生,我們可以通過以下方式獲取Scheduler的實例:
//從ServletContext上下文中查找SchedulerFactory SchedulerFactory factory = (SchedulerFactory) ServletActionContext.getServletContext().getAttribute("org.quartz.impl.StdSchedulerFactory.KEY"); //獲取Scheduler對象 Scheduler defScheduler = factory.getScheduler(); 任務(wù),其實就是一個接口。要創(chuàng)建一個任務(wù),必須得實現(xiàn)這個接口。該接口只有一個execute方法,任務(wù)每次被調(diào)用的時候都會執(zhí)行這個execute方法的邏輯。 public class TestJob impletemens org.quartz.Job{ @Override public void execute(JobExecutionContext context) throws JobExecutionException{ // you business logic // … System.out.println("########### this is testJob running ############"); } } JobDetail 用來保存我們作業(yè)的詳細信息。一個JobDetail可以有多個Trigger,但是一個Trigger只能對應(yīng)一個JobDetail。下面是JobDetail的一些常用的屬性和含義 參數(shù)名 類型 備注 name String 任務(wù)的名稱,必須 group String 任務(wù)所在組,默認為DEFAULT jobClass Class 任務(wù)的實現(xiàn)類,必須 description String 描述 jobDataMap JobDataMap 用來給作業(yè)提供數(shù)據(jù)支持的數(shù)據(jù)結(jié)構(gòu) volatility Boolean 重啟應(yīng)用之后是否刪除任務(wù)的相關(guān)信息,默認false durability Boolean 任務(wù)完成之后是否依然保留到數(shù)據(jù)庫,默認false shouldRecover Boolean 應(yīng)用重啟之后時候忽略過期任務(wù),默認false jobListeners Set 監(jiān)聽器作業(yè)
Job
JobDetail
JobDataMap
這是一個給作業(yè)提供數(shù)據(jù)支持的數(shù)據(jù)結(jié)構(gòu),使用方法和java.util.Map一樣,非常方便。當(dāng)一個作業(yè)被分配給調(diào)度器時,JobDataMap實例就隨之生成。
Job有一個StatefulJob子接口,代表有狀態(tài)的任務(wù),該接口是一個沒有方法的標簽接口,其目的是讓Quartz知道任務(wù)的類型,以便采用不同的執(zhí)行方案。無狀態(tài)任務(wù)在執(zhí)行時擁有自己的JobDataMap拷貝,對JobDataMap的更改不會影響下次的執(zhí)行。而有狀態(tài)任務(wù)共享共享同一個JobDataMap實例,每次任務(wù)執(zhí)行對JobDataMap所做的更改會保存下來,后面的執(zhí)行可以看到這個更改,也即每次執(zhí)行任務(wù)后都會對后面的執(zhí)行發(fā)生影響。
正因為這個原因,無狀態(tài)的Job可以并發(fā)執(zhí)行,而有狀態(tài)的StatefulJob不能并發(fā)執(zhí)行,這意味著如果前次的StatefulJob還沒有執(zhí)行完畢,下一次的任務(wù)將阻塞等待,直到前次任務(wù)執(zhí)行完畢。有狀態(tài)任務(wù)比無狀態(tài)任務(wù)需要考慮更多的因素,程序往往擁有更高的復(fù)雜度,因此除非必要,應(yīng)該盡量使用無狀態(tài)的Job。
如果Quartz使用了數(shù)據(jù)庫持久化任務(wù)調(diào)度信息,無狀態(tài)的JobDataMap僅會在Scheduler注冊任務(wù)時保持一次,而有狀態(tài)任務(wù)對應(yīng)的JobDataMap在每次執(zhí)行任務(wù)后都會進行保存。
JobDataMap實例也可以與一個觸發(fā)器相關(guān)聯(lián)。這種情況下,對于同一作業(yè)的不同觸發(fā)器,我們可以在JobDataMap中添加不同的數(shù)據(jù),以便作業(yè)在不同時間執(zhí)行時能夠提供更為靈活的數(shù)據(jù)支持(學(xué)校上午放眼保健操錄音第一版,下午放第二版)。
不管是有狀態(tài)還是無狀態(tài)的任務(wù),在任務(wù)執(zhí)行期間對Trigger的JobDataMap所做的更改都不會進行持久,也即不會對下次的執(zhí)行產(chǎn)生影響。
posted on 2011-08-07 13:24 w@ns0ng 閱讀(1597) 評論(0) 編輯 收藏 所屬分類: jboss 、java