Knight of the round table

          wansong

          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上面注冊一個JobDetailTrigger

          Scheduler提攜了所有TriggerJobDetail,使它們協(xié)調(diào)工作。這些TriggerJobDetail通過自身的namegroup屬性區(qū)分

                 Scheduler SchedulerFactory產(chǎn)生,我們可以通過以下方式獲取Scheduler的實例:

               //ServletContext上下文中查找SchedulerFactory

               SchedulerFactory   factory = (SchedulerFactory)

          ServletActionContext.getServletContext().getAttribute("org.quartz.impl.StdSchedulerFactory.KEY");

           

             //獲取Scheduler對象

             Scheduler defScheduler = factory.getScheduler();

          作業(yè)

          Job

          任務(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

          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)聽器

           

           

          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)  編輯  收藏 所屬分類: jbossjava

          主站蜘蛛池模板: 南阳市| 谷城县| 玉环县| 盐亭县| 荆州市| 台南市| 高安市| 云南省| 南澳县| 彰化县| 庄浪县| 临安市| 松潘县| 称多县| 牙克石市| 繁昌县| 滕州市| 洛宁县| 大石桥市| 抚松县| 阳高县| 曲靖市| 永善县| 韶山市| 仙游县| 五峰| 上杭县| 屏东市| 盐城市| 黎平县| 扬州市| 松潘县| 军事| 井冈山市| 贡山| 潞城市| 青冈县| 南城县| 微山县| 普宁市| 江口县|