- mccxj
- 等级: 初级会员

- 性别:

- 文章: 41
- 积分: 50
- 来自: 广州

|
最后更新时间:2007-06-07 关键字: Castor Quartz
Quartz提供了一个xml配置的插件,或许是我还没弄懂,找不到如何在非web项目上的使用方法,退而求其次,使用Castor来实现这个配置还是相当方便的。Castor也是要您的数据用类 JavaBean 的对象表示,Castor 就能自动生成表示这些数据的文档格式,然后从文档重构原始数据。你要提供的只是xml映射文件而已。关于Castor和Quartz的更多内容,请参考文献。现在我们就在实现这个功能。
首先,我们需要定义Quartz所需要的xml文件格式。由于一般来说,SimpleTrigger和CronTrigger都是经常使用而且常用的参数也不多。我们就把所需要的xml定义为
xml 代码
- <?xml version="1.0" encoding="UTF-8"?>
- <schedule>
- <description>任务调度</description>
- <job name="job1" group="group1" classname="classname1">
- <param name="expression">0 0/2 18 * * ?</param>
- </job>
- </schedule>
介绍:
任务调度:包括多个任务,一个任务为一个job,job包括name、group和classname属性,都是必不可少的其中(name, group)必须是唯一的,而classname中的类必须实现org.quartz.Job接口
job下有若干个属性,分别是
starttime 任务开始调度时间,格式为 yyyy:mm:dd hh:mm:ss
endtime 任务结束时间,格式为 yyyy:mm:dd hh:mm:ss
expression 时间表达式,与LINUX的时间调度表达式相同,格式为 ss mm hh dd mm yyyy w
repeat 任务重复次数,默认为无限次,或者-1表示无数次,否则填入调度次数
interval 调度时间间隔,如果定义了expression,则此属性无效,否则此属性不能缺少,
关于这方面详细的资料,请参考官网文档。
对于这个xml,我们要定义所需的javabean。
这里我们定义三个类来对应schedule,job,param元素(请参考附带源码),具体的关于castor xml mapping的写法,请参考:http://www.castor.org/xml-mapping.html
根据java代码得到的xml配置文件代码如下:
xml 代码
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE mapping PUBLIC "-//EXOLAB/Castor Object Mapping DTD Version 1.0//EN"
- "http://castor.exolab.org/mapping.dtd">
- <mapping>
- <class name="com.muzak.util.schedule.XmlParam">
- <field name="name" type="java.lang.String">
- <bind-xml name="name" node="attribute" required="true"/>
- </field>
- <field name="value" type="java.lang.String" required="true">
- <bind-xml node="text"/>
- </field>
- </class>
- <class name="com.muzak.util.schedule.XmlJob">
- <field name="name" type="java.lang.String" required="true">
- <bind-xml name="name" node="attribute"/>
- </field>
- <field name="group" type="java.lang.String" required="true">
- <bind-xml name="group" node="attribute"/>
- </field>
- <field name="classname" type="java.lang.String" required="true">
- <bind-xml name="classname" node="attribute"/>
- </field>
- <field name="params" type="com.muzak.util.schedule.XmlParam" collection="set">
- <bind-xml name="param" node="element"/>
- </field>
- </class>
- <class name="com.muzak.util.schedule.XmlSchedule">
- <map-to xml="schedule"/>
- <field name="description" type="java.lang.String">
- <bind-xml name="description" node="element"/>
- </field>
- <field name="jobs" type="com.muzak.util.schedule.XmlJob" collection="set">
- <bind-xml name="job" node="element"/>
- </field>
- </class>
- </mapping>
Castor是使用两个简单的方法来实现从xml读取和写入数据的。我们把这两方法进行封装,详细参考MarshalUtil.java
java 代码
- public static void marshal(Mapping mapping, OutputStream os, Object obj)
- throws Exception
- {
- OutputFormat format = OutputFormat.createPrettyPrint();
-
- format.setEncoding("UTF-8");
- XMLWriter writer = new XMLWriter(os, format);
- Marshaller marshaller = new Marshaller(writer);
- marshaller.setMapping(mapping);
- marshaller.marshal(obj);
- }
-
- public static Object unmarshal(Mapping mapping, InputStream is)
- throws Exception
- {
- Unmarshaller unmarshaller = new Unmarshaller(mapping);
- return unmarshaller.unmarshal(new InputStreamReader(is));
- }
另外,我们还对Quartz创建trigger和jobdetail的方法进行封装:
- public static JobDetail createJobDetail(XmlJob xmljob) throws Exception
- {
- Class jobclass = Class.forName(xmljob.getClassname());
- return new JobDetail(xmljob.getName(), xmljob.getGroup(), jobclass);
- }
-
- public static Trigger createTrigger(XmlJob xmljob) throws Exception
- {
- Trigger trigger = null;
- Map<String, String> parammap = new HashMap<String, String>();
- for (XmlParam param : xmljob.getParams())
- {
- parammap.put(param.getName(), param.getValue());
- }
- Date starttime = (parammap.containsKey(START_TIME) ? DateFormat
- .parse(parammap.get(START_TIME)) : null);
- if (starttime == null)
- {
- starttime = new Date();
- }
- Date endtime = (parammap.containsKey(END_TIME) ? DateFormat
- .parse(parammap.get(END_TIME)) : null);
- int repeat = (parammap.containsKey(REPEAT_TIME) ? Integer
- .parseInt(parammap.get(REPEAT_TIME)) : -1);
- if (repeat == -1)
- {
- repeat = SimpleTrigger.REPEAT_INDEFINITELY;
- }
- if (parammap.containsKey(CRON_EXPRESSION))
- {
- trigger = new CronTrigger(xmljob.getName(), xmljob.getGroup(),
- xmljob.getName(), xmljob.getGroup(), starttime, endtime,
- parammap.get(CRON_EXPRESSION));
- }
- else
- {
- String intervalstr = parammap.get(INTERVAL);
- trigger = new SimpleTrigger(xmljob.getName(), xmljob.getGroup(),
- starttime, endtime, repeat, translateTime(intervalstr));
- }
- return trigger;
- }
java 代码
最后,JobDetail和Trigger都有了,剩下的只是用个scheduler来调用了
最后写个Job就可以运行了。调用ScheduleManager.initFile(Config.JOBMAPPING_PATH,Config.JOB_PATH);就可以了。m具体请参考代码。
参考文献:
关于Quartz(http://www.opensymphony.com/quartz/)
http://www.onjava.com/lpt/a/4637
http://www.ibm.com/developerworks/cn/java/j-quartz/
http://www.opensymphony.com/quartz/wikidocs/CronTriggers%20Tutorial.html
关于Castor(http://www.castor.org/index.html)
http://www.ibm.com/developerworks/cn/xml/x-bindcastor/
http://www.castor.org/xml-mapping.html
http://www.castor.org/xml-best-practice.html
http://www.netobjectives.com/xml/download/castor.pdf
http://www.onjava.com/pub/a/onjava/2001/10/24/xmldatabind.html
- public static void initFile(String mappingfile,String filename) throws Exception
- {
- log.info("init schedule!!!!");
- Mapping mapping = new Mapping();
- mapping.loadMapping(mappingfile);
-
- xmlschedule = (XmlSchedule) MarshalUtil.unmarshal(mapping,filename);
- scheduler = new StdSchedulerFactory().getScheduler();
- start();
- }
-
- public static void start() throws Exception
- {
- if (xmlschedule != null && xmlschedule.getJobs() != null)
- {
- for (XmlJob xmljob : xmlschedule.getJobs())
- {
- JobDetail jobdetail = ScheduleUtil
- .createJobDetail(xmljob);
- Trigger trigger = ScheduleUtil.createTrigger(xmljob);
- scheduler.scheduleJob(jobdetail, trigger);
- }
- }
- scheduler.start();
- }
java 代码
声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
| 返回顶楼 |
|
|
- jason823
- 等级:


- 性别:

- 文章: 22
- 积分: 199

|
Quartz在非web项目上使用的话,如果是一个独立应用,把Quartz放在一个线程中加载就可以了。
|
| 返回顶楼 |
|
|