quartz-scheduler 定時器
在闡述quartz是個什么東西之前,我先說個事。很多時候,我們經(jīng)常在臺歷上標(biāo)注出,某一天是某人的生日,某一天有某個重要的事情,給自己一個提醒。一個臺歷加上所要做的事情的內(nèi)容,就是一個scheduler。計算機系統(tǒng),是幫助人們完成既定事務(wù)的。所以,我們希望,把“日程規(guī)劃+具體事務(wù)”,交給系統(tǒng),系統(tǒng)就能按照我們的要求自動去工作。好了,quartz就是這么一個東西。我們只需要定義好時間表,并對應(yīng)指定的操作,它就能夠按照我們的要求在指定時間驅(qū)動指定的工作,如此簡單。
quartz中,所有需要驅(qū)動的工作,都是實現(xiàn)job接口的類。job接口很簡單,就只有一個excute()方法,只要把這個類交給quartz,它就會自動去執(zhí)行這個方法。方法里面定義的就是我們真正需要進行的工作,恩,這都沒有什么問題。
現(xiàn)在的問題在于,很多時候我們需要執(zhí)行的工作類,是外部類,并沒有繼承job接口。也就是說,我們希望quartz能夠驅(qū)動任意的類的任意方法,這該怎么辦?這也是我第一階段的一個小目標(biāo)。
一開始我想改變quartz的驅(qū)動方式,也就是改變runshell里面的東西,后來發(fā)現(xiàn),這太復(fù)雜了,這是quartz最核心的東西,動一發(fā)而牽全身。我只是想利用quartz的優(yōu)勢,并不想大規(guī)模的改動。
走了不少彎路之后,想了一個不錯的方案。就是,我們只需要定義好所需要的類名、方法名、方法需要的參數(shù),然后利用reflect,來實例化類,然后invoke指定方法。而把這些工作放在一個通用的job模板中的excute方法,這樣,我們只需要把指定參數(shù)傳入這個通用job模板,然后直接驅(qū)動此job就能實現(xiàn)我們上面的目標(biāo)。
參數(shù)傳遞采用的方案是:
1、數(shù)據(jù)源。把我們需要指定的信息以配置文件的方式給出,主要是,工作組、工作名、工作對應(yīng)的類,指定的方法,所需的參數(shù)。
2、數(shù)據(jù)傳遞。寫一個metadata用來包裝這些信息,這樣做是為了將來管理的方便。然后用metadata來初始化jobdetail,重寫工作組、工作名,將類信息保存在jobDataMap中,然后在執(zhí)行excute的時候,再把這些信息取出來。
3、工作執(zhí)行。利用reflect技術(shù),執(zhí)行指定類的指定方式。
4、數(shù)據(jù)返回。excute結(jié)束之前,把需要返回的數(shù)據(jù)放在jobDataMap中,scheduler結(jié)束之前,把這些數(shù)據(jù)從jobDataMap中取出來。
完美的方案,開心一下!
下一步研究quartz的另外一個大部分 時間表。
quartz的一些基本概念
Job 與 JobDetail
Job是quartz中最基本的概念了,Job做為一個接口只有一個execute()方法等待實現(xiàn),理論上所有用quartz執(zhí)行的job都需要實現(xiàn)這個接口,但是現(xiàn)在大多數(shù)的系統(tǒng)都不會服從這種約束,而希望能夠更自由的調(diào)用原有系統(tǒng)中的類的方法。實現(xiàn)自由調(diào)用,有兩個途徑,我上一節(jié)總結(jié)中的那個方案是一個簡單的途徑,另外一個途徑就是借助于spring的class bean,這個將在后面介紹。
StatefullJob接口: 無狀態(tài)任務(wù)對應(yīng)的JobDataMap可以認(rèn)為是只讀的,而有狀態(tài)的任務(wù)在多次執(zhí)行過程中保留對JobDataMap所作的修改,一個后果是有狀態(tài)任務(wù)無法被并發(fā)執(zhí)行。上面這句話是抄襲的,事實上我還是不是很清楚二者究竟的區(qū)別?
JobDetail是用來包裝Job實例的具體細(xì)節(jié)的。Job以class的方式傳入JobDetail,quartz會自動實例化Job類的。同時需要規(guī)定job的name和group,在jobdetail的validate()下,一個job是必須有name和group屬性,并且二者組合標(biāo)示唯一的job。JobDetail中的一些重要數(shù)據(jù)存放在JobDataMap中,這個map可以用來在控制程序和job內(nèi)傳遞需要傳遞的參數(shù)。
JobDetail還有三個重要的boolean值的屬性,分別是durability、volatility、shouldRecover。這三個屬性默認(rèn)是false,主要在數(shù)據(jù)庫操作的時候起作用。
Trigger時間調(diào)度
相對于job,trigger簡單一些。所謂的時間調(diào)度,就是設(shè)置job執(zhí)行的時間表。Trigger主要分為SimpleTrigger和CronTrigger兩大類。前者主要是以1/1000
為單位的簡單時間,可是設(shè)置startTime、endTime、repeatCount、repeatInterval等主要參數(shù)。CronTrigger的詳細(xì)用法參看quartz文檔的的CronTriggers Tutorial。
scheduler.schedulerJob(jobDetail, trigger);將JobDetail和對應(yīng)的Trigger部署到scheduler中,然后根據(jù)trigger的定義,自動執(zhí)行指定job。
Calendar這個類用來標(biāo)識出特殊的時間,scheduler根據(jù)trigger執(zhí)行job的時候,如果遇到這些標(biāo)識出的特殊時間則不執(zhí)行job。Calendar具體的接口有BaseCalendar、AnnualCalendar、HolidayCalendar、MonthlyCalendar、WeeklyCalendar等等。calendar的具體用法參看quartz的文檔。
Misfire Instruction....設(shè)定當(dāng)trigger錯過了觸發(fā)時刻的時候需要采取的處理策略
TriggerUtils相當(dāng)于一個trigger factory,方便我們?nèi)〉锰厥鈚rigger的實例,而不用自己去構(gòu)造。
Listener是用來監(jiān)聽quartz的執(zhí)行過程的,主要有JobListener,TriggerListener,SchedulerListener。joblistener監(jiān)聽一個job在quartz中執(zhí)行的待執(zhí)行,禁止執(zhí)行,執(zhí)行完畢三個狀態(tài)。TriggerListener監(jiān)聽trigger觸發(fā)、完成、錯過、禁止四個狀態(tài)。SchedulerListener監(jiān)聽scheduler執(zhí)行過程的一些狀態(tài),具體參看SchedulerListener的源代碼。
轉(zhuǎn)自:http://flyinglife.javaeye.com/blog/74553
另:http://forums.opensymphony.com/category.jspa?categoryID=8。
另外推薦一個java的blog:http://www.aygfsteel.com/javaora/。
posted on 2010-08-11 18:28 皮卡諾 閱讀(1018) 評論(0) 編輯 收藏 所屬分類: java