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