论坛首页 Java版 设计模式

使用Castor实现Quartz的xml配置

浏览 1942 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2007-06-07 关键字: Castor Quartz

  Quartz提供了一个xml配置的插件,或许是我还没弄懂,找不到如何在非web项目上的使用方法,退而求其次,使用Castor来实现这个配置还是相当方便的。Castor也是要您的数据用类 JavaBean 的对象表示,Castor 就能自动生成表示这些数据的文档格式,然后从文档重构原始数据。你要提供的只是xml映射文件而已。关于CastorQuartz的更多内容,请参考文献。现在我们就在实现这个功能。

首先,我们需要定义Quartz所需要的xml文件格式。由于一般来说,SimpleTriggerCronTrigger都是经常使用而且常用的参数也不多。我们就把所需要的xml定义为

xml 代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <schedule>  
  3.   <description>任务调度</description>  
  4.   <job name="job1" group="group1" classname="classname1">  
  5.     <param name="expression">0 0/2 18 * * ?</param>  
  6.   </job>  
  7. </schedule>  

 

介绍:

任务调度:包括多个任务,一个任务为一个jobjob包括namegroupclassname属性,都是必不可少的其中(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

这里我们定义三个类来对应schedulejobparam元素(请参考附带源码),具体的关于castor xml mapping的写法,请参考:http://www.castor.org/xml-mapping.html

根据java代码得到的xml配置文件代码如下:

xml 代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE mapping PUBLIC "-//EXOLAB/Castor Object Mapping DTD Version 1.0//EN"   
  3.        "http://castor.exolab.org/mapping.dtd">  
  4. <mapping>  
  5.     <class name="com.muzak.util.schedule.XmlParam">  
  6.         <field name="name" type="java.lang.String">  
  7.            <bind-xml name="name" node="attribute" required="true"/>  
  8.         </field>  
  9.         <field name="value" type="java.lang.String" required="true">  
  10.            <bind-xml node="text"/>  
  11.         </field>  
  12.     </class>  
  13.     <class name="com.muzak.util.schedule.XmlJob">  
  14.         <field name="name" type="java.lang.String" required="true">  
  15.            <bind-xml name="name" node="attribute"/>  
  16.         </field>  
  17.         <field name="group" type="java.lang.String" required="true">  
  18.            <bind-xml name="group" node="attribute"/>  
  19.         </field>  
  20.         <field name="classname" type="java.lang.String" required="true">  
  21.            <bind-xml name="classname" node="attribute"/>  
  22.         </field>  
  23.         <field name="params" type="com.muzak.util.schedule.XmlParam" collection="set">  
  24.            <bind-xml name="param" node="element"/>  
  25.         </field>  
  26.     </class>    
  27.     <class name="com.muzak.util.schedule.XmlSchedule">  
  28.         <map-to xml="schedule"/>  
  29.         <field name="description" type="java.lang.String">  
  30.            <bind-xml name="description" node="element"/>  
  31.         </field>  
  32.         <field name="jobs" type="com.muzak.util.schedule.XmlJob" collection="set">  
  33.            <bind-xml name="job" node="element"/>  
  34.         </field>  
  35.     </class>  
  36. </mapping>  

 Castor是使用两个简单的方法来实现从xml读取和写入数据的。我们把这两方法进行封装,详细参考MarshalUtil.java

java 代码
  1.     public static void marshal(Mapping mapping, OutputStream os, Object obj)   
  2.             throws Exception   
  3.     {   
  4.         OutputFormat format = OutputFormat.createPrettyPrint();   
  5. //        format.setEncoding("GB18030");   
  6.         format.setEncoding("UTF-8");   
  7.         XMLWriter writer = new XMLWriter(os, format);   
  8.         Marshaller marshaller = new Marshaller(writer);   
  9.         marshaller.setMapping(mapping);   
  10.         marshaller.marshal(obj);   
  11.     }   
  12.   
  13.     public static Object unmarshal(Mapping mapping, InputStream is)   
  14.             throws Exception   
  15.     {   
  16.         Unmarshaller unmarshaller = new Unmarshaller(mapping);   
  17.         return unmarshaller.unmarshal(new InputStreamReader(is));   
  18.     }  

 另外,我们还对Quartz创建trigger和jobdetail的方法进行封装:

 

  1. public static JobDetail createJobDetail(XmlJob xmljob) throws Exception   
  2. {   
  3.     Class jobclass = Class.forName(xmljob.getClassname());   
  4.     return new JobDetail(xmljob.getName(), xmljob.getGroup(), jobclass);   
  5. }   
  6.   
  7. public static Trigger createTrigger(XmlJob xmljob) throws Exception   
  8. {   
  9.     Trigger trigger = null;   
  10.     Map<String, String> parammap = new HashMap<String, String>();   
  11.     for (XmlParam param : xmljob.getParams())   
  12.     {   
  13.         parammap.put(param.getName(), param.getValue());   
  14.     }   
  15.     Date starttime = (parammap.containsKey(START_TIME) ? DateFormat   
  16.             .parse(parammap.get(START_TIME)) : null);   
  17.     if (starttime == null)   
  18.     {   
  19.         starttime = new Date();   
  20.     }   
  21.     Date endtime = (parammap.containsKey(END_TIME) ? DateFormat   
  22.             .parse(parammap.get(END_TIME)) : null);   
  23.     int repeat = (parammap.containsKey(REPEAT_TIME) ? Integer   
  24.             .parseInt(parammap.get(REPEAT_TIME)) : -1);   
  25.     if (repeat == -1)   
  26.     {   
  27.         repeat = SimpleTrigger.REPEAT_INDEFINITELY;   
  28.     }   
  29.     if (parammap.containsKey(CRON_EXPRESSION))   
  30.     {   
  31.         trigger = new CronTrigger(xmljob.getName(), xmljob.getGroup(),   
  32.                 xmljob.getName(), xmljob.getGroup(), starttime, endtime,   
  33.                 parammap.get(CRON_EXPRESSION));   
  34.     }   
  35.     else  
  36.     {   
  37.         String intervalstr = parammap.get(INTERVAL);   
  38.         trigger = new SimpleTrigger(xmljob.getName(), xmljob.getGroup(),   
  39.                 starttime, endtime, repeat, translateTime(intervalstr));   
  40.     }   
  41.     return trigger;   
  42. }  
java 代码

 最后,JobDetail和Trigger都有了,剩下的只是用个scheduler来调用了

 

 最后写个Job就可以运行了。调用ScheduleManager.initFile(Config.JOBMAPPING_PATH,Config.JOB_PATH);就可以了。m具体请参考代码。

 参考文献:

 

关于Quartzhttp://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

关于Castorhttp://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

 

 

 

 

 

 

  1. public static void initFile(String mappingfile,String filename) throws Exception   
  2. {   
  3.     log.info("init schedule!!!!");   
  4.     Mapping mapping = new Mapping();   
  5.     mapping.loadMapping(mappingfile);   
  6.   
  7.     xmlschedule = (XmlSchedule) MarshalUtil.unmarshal(mapping,filename);   
  8.     scheduler = new StdSchedulerFactory().getScheduler();   
  9.     start();   
  10. }   
  11.   
  12. public static void start() throws Exception   
  13. {   
  14.     if (xmlschedule != null && xmlschedule.getJobs() != null)   
  15.     {   
  16.         for (XmlJob xmljob : xmlschedule.getJobs())   
  17.         {   
  18.             JobDetail jobdetail = ScheduleUtil   
  19.                     .createJobDetail(xmljob);   
  20.             Trigger trigger = ScheduleUtil.createTrigger(xmljob);   
  21.             scheduler.scheduleJob(jobdetail, trigger);   
  22.         }   
  23.     }   
  24.     scheduler.start();   
  25. }  
java 代码
   
最后更新时间:2007-06-14
Quartz在非web项目上使用的话,如果是一个独立应用,把Quartz放在一个线程中加载就可以了。
   
0 请登录后投票
论坛首页 Java版 设计模式

跳转论坛:
JavaEye推荐