???
Quartz作為一個(gè)開源的作業(yè)調(diào)度框架,已經(jīng)廣泛應(yīng)用于j2ee中。因?yàn)轫?xiàng)目需要一個(gè)任務(wù)管理模塊,所以選擇了Quartz這個(gè)強(qiáng)大的框架,并對(duì)其進(jìn)行
了擴(kuò)展以適應(yīng)項(xiàng)目的要求。首先介紹一下我們的系統(tǒng)構(gòu)架,采用webwork,spring,hibernate整合架構(gòu),我的任務(wù)是無(wú)縫的把Quartz
加入到系統(tǒng),提供一個(gè)界面,提供一些操作,使最終用戶能夠自己定義在什么時(shí)間對(duì)什么東西做哪些事情,“哪些事情”是預(yù)先定義的,提供給客戶選擇,這是客戶
需求,系統(tǒng)地要求是能夠容易的擴(kuò)展,對(duì)增加一個(gè)新的任務(wù)定義提供一些簡(jiǎn)單的接口。這里不對(duì)Quartz作介紹了,想了解的人參考官方網(wǎng)站:http:
//www.opensymphony.com/quartz/,由于涉及的東西比較多,有些細(xì)節(jié)就帶過(guò)了,我就大致的介紹一下總體的設(shè)計(jì)。
??? 作業(yè)調(diào)度框架,主要要解決的問(wèn)題是在某個(gè)時(shí)間對(duì)某些對(duì)象作某些動(dòng)作。
???
對(duì)于某個(gè)時(shí)間,Quarta提供一個(gè)字符表達(dá)式來(lái)表示,這方面要做的是提供一個(gè)方便的界面,直觀的對(duì)其進(jìn)行設(shè)置,不能讓最終客戶看那些對(duì)客戶沒(méi)意義的字符
串。這個(gè)工作需要解析那些字符,做起來(lái)還是有點(diǎn)意思的,也是比較麻煩的,有興趣的話可以自己去試試。
???
對(duì)于某些對(duì)象作和某些動(dòng)作,Quartz都交給程序員自己去定義,它提供一個(gè)Job接口,對(duì)我們來(lái)說(shuō)增加任務(wù)是比較簡(jiǎn)單的一件事情.既然Quartz提供
這么簡(jiǎn)單的接口,我為什么還要對(duì)其進(jìn)行擴(kuò)展呢?這就要來(lái)看"某些對(duì)象"了.在一般的系統(tǒng)來(lái)"某個(gè)動(dòng)作"所操縱的對(duì)象是固定的,比如定期刪除日至,定期檢查
庫(kù)存等.由于系統(tǒng)地特殊性,我們"某個(gè)動(dòng)作"對(duì)哪些對(duì)象是不確定的,"哪些對(duì)象"由我提供一個(gè)界面,由最終客戶去決定對(duì)一個(gè)或多個(gè)對(duì)象進(jìn)行操作.
???
這樣就引入了一個(gè)范圍的概念,"某個(gè)動(dòng)作"是作用在一定范圍內(nèi)的,這個(gè)范圍就不僅僅是哪些對(duì)象了,也可能是時(shí)間范圍,比如刪除幾天前的日志信息.到這里對(duì)
任務(wù)的定義有所改變了,一個(gè)任務(wù)包括一些范圍也可以說(shuō)是條件,這個(gè)條件不包括觸發(fā)點(diǎn)這個(gè)條件),一個(gè)動(dòng)作.所以系統(tǒng)中定義了一個(gè)IRange接口,范圍的
表示都保存在一個(gè)XML字符串,XML字符串的結(jié)構(gòu)和怎么解析都交給具體的子對(duì)象,這樣就給了子類的靈活性.
public interface IRange {
??? public Map saveToMap(String strMap);//保存范圍參數(shù)
??? public List getResult(Map map);//解析范圍參數(shù),并返回操作對(duì)象線程列表
??? public List getViewInfo();取得頁(yè)面表示方式,結(jié)合了webwork
}
一個(gè)任務(wù)對(duì)應(yīng)一個(gè)IRange的子類,IRange的子類對(duì)任務(wù)的各種參數(shù)范圍,動(dòng)作進(jìn)行了實(shí)現(xiàn).接著還加入一個(gè)IRangeManager接口,
public interface IRangeManager {
??? public void saveDataMap(Long jobId, String strMap)throws SchedulerException;//保存范圍參數(shù)
??? public List getObjects(Map map);//取得對(duì)象列表,其中包括了對(duì)參數(shù)的解析
??? public List getViews(Map map);
}
??? 實(shí)現(xiàn)的功能是對(duì)范圍進(jìn)行管理,包括對(duì)Quartz的操作,主要一些保存數(shù)據(jù)庫(kù)等的操作,這樣對(duì)于增加一個(gè)新的Range子類就可以不用知道Quartz了.
??? 這樣因?yàn)楹芏鄸|西都是可配置的,增加了靈活性,對(duì)以后任務(wù)的添加定義了一些接口,考慮到了擴(kuò)展性.在設(shè)計(jì)這個(gè)模塊的時(shí)候,總的思路是把那些不變的東西都封裝起來(lái),把能變得東西都交給具體的任務(wù)了.
上面我只是大致講了一下,由于水平有限,可能講的不是清楚,比較亂,我沒(méi)有提供具體的例子,只是提供了一個(gè)思路,希望對(duì)大家有所幫助,或者你還有更好的設(shè)計(jì),請(qǐng)與我聯(lián)系.