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了.
这样因为很多东西都是可配置的,增加了灵活性,对以后任务的添加定义了一些接口,考虑到了扩展性.在设计这个模块的时候,总的思路是把那些不变的东西都封装起来,把能变得东西都交给具体的任务了.
上面我只是大致讲了一下,由于水平有限,可能讲的不是清楚,比较乱,我没有提供具体的例子,只是提供了一个思路,希望对大家有所帮助,或者你还有更好的设计,请与我联系.