1. 目的:动态设置时间,触发相应的任务

2. 系统架构为 struts + spring + hibernate

3. 实现步骤:
  • 在页面上设置时间;
  • 将时间转换为Unix Cron Expression;
  • 将转换后的时间规则表达式记录到数据库中(也可以写入xml文件中,这里是项目需要记录入数据库中);
  • 从数据库中得到相应的时间规则表达式;
  • 更新您的任务触发器的时间设置;
  • RESCHEDULE THE JOB。; - )
4. 具体实现细节:
1) 在页面上设置时间
根据具体的业务需求,设置时间规则,下面以某一项目为例,需要 按每月、每周、自定义分为三种规则。
 1 Spring Quartz如何动态配置时间_动态配置时间 < tr >
 2 Spring Quartz如何动态配置时间_动态配置时间           < th > 执行这个任务 </ th >
 3 Spring Quartz如何动态配置时间_动态配置时间           < td  style ="font-weight:bold;" >
 4 Spring Quartz如何动态配置时间_动态配置时间            < html:radio  property ="everyWhat"  styleClass ="InputBorderNone"  value ="monthly"  onclick ="changeStatus(this.value)" > 每月 </ html:radio >
 5 Spring Quartz如何动态配置时间_动态配置时间            < html:radio  property ="everyWhat"  styleClass ="InputBorderNone"  value ="weekly"  onclick ="changeStatus(this.value)" > 每周 </ html:radio >
 6 Spring Quartz如何动态配置时间_动态配置时间            < html:radio  property ="everyWhat"  styleClass ="InputBorderNone"  value ="userDefined"  onclick ="changeStatus(this.value)" > 自定义 </ html:radio >
 7 Spring Quartz如何动态配置时间_动态配置时间            < html:hidden  property ="jobName"  value ="compare"   />
 8 Spring Quartz如何动态配置时间_动态配置时间           </ td >
 9 Spring Quartz如何动态配置时间_动态配置时间 </ tr >
10 Spring Quartz如何动态配置时间_动态配置时间

每月则需要选择该月的第几个星期的星期几
 1 Spring Quartz如何动态配置时间_动态配置时间 < tr  style ="display:"  id ="whichWeek" >
 2 Spring Quartz如何动态配置时间_动态配置时间           < th > 选择第几个星期 </ th >
 3 Spring Quartz如何动态配置时间_动态配置时间           < td  style ="font-weight:bold;" >
 4 Spring Quartz如何动态配置时间_动态配置时间            < html:select  property ="week" >
 5 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="1" > </ html:option >
 6 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="2" > </ html:option >
 7 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="3" > </ html:option >
 8 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="4" > </ html:option >
 9 Spring Quartz如何动态配置时间_动态配置时间            </ html:select >
10 Spring Quartz如何动态配置时间_动态配置时间            < html:select  property ="dayOfMonth" >
11 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="1" > 星期日 </ html:option >
12 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="2" > 星期一 </ html:option >
13 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="3" > 星期二 </ html:option >
14 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="4" > 星期三 </ html:option >
15 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="5" > 星期四 </ html:option >
16 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="6" > 星期五 </ html:option >
17 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="7" > 星期六 </ html:option >
18 Spring Quartz如何动态配置时间_动态配置时间            </ html:select >
19 Spring Quartz如何动态配置时间_动态配置时间          </ td >  
20 Spring Quartz如何动态配置时间_动态配置时间  </ tr >
21 Spring Quartz如何动态配置时间_动态配置时间

每周则需要选择星期几
 1 Spring Quartz如何动态配置时间_动态配置时间 < tr  style ="display:none"  id ="whichDay" >
 2 Spring Quartz如何动态配置时间_动态配置时间           < th > 选择星期 </ th >
 3 Spring Quartz如何动态配置时间_动态配置时间           < td  style ="font-weight:bold;" >
 4 Spring Quartz如何动态配置时间_动态配置时间            < html:select  property ="dayOfWeek" >
 5 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="1" > 星期日 </ html:option >
 6 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="2" > 星期一 </ html:option >
 7 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="3" > 星期二 </ html:option >
 8 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="4" > 星期三 </ html:option >
 9 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="5" > 星期四 </ html:option >
10 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="6" > 星期五 </ html:option >
11 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="7" > 星期六 </ html:option >
12 Spring Quartz如何动态配置时间_动态配置时间            </ html:select >
13 Spring Quartz如何动态配置时间_动态配置时间         </ td >  
14    </ tr >
15 Spring Quartz如何动态配置时间_动态配置时间

自定义则选择具体的日期,如 2007-1-10

三种规则都需要设定时间点
 1 Spring Quartz如何动态配置时间_动态配置时间 < tr >
 2 Spring Quartz如何动态配置时间_动态配置时间           < th > 起始时间 </ th >
 3 Spring Quartz如何动态配置时间_动态配置时间           < td  style ="font-weight:bold;" >
 4 Spring Quartz如何动态配置时间_动态配置时间            < html:select  property ="timeType"  styleId ="type"  onchange ="changeStatus2(this.value)" >
 5 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="AM" > 上午 </ html:option >
 6 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="PM" > 下午 </ html:option >
 7 Spring Quartz如何动态配置时间_动态配置时间            </ html:select >
 8 Spring Quartz如何动态配置时间_动态配置时间            < html:select  property ="hour"  styleId ="amHours" >
 9 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="1" > 1 </ html:option >
10 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="2" > 2 </ html:option >
11 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="3" > 3 </ html:option >
12 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="4" > 4 </ html:option >
13 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="5" > 5 </ html:option >
14 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="6" > 6 </ html:option >
15 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="7" > 7 </ html:option >
16 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="8" > 8 </ html:option >
17 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="9" > 9 </ html:option >
18 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="10" > 10 </ html:option >
19 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="11" > 11 </ html:option >
20 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="12" > 12 </ html:option >
21 Spring Quartz如何动态配置时间_动态配置时间            </ html:select >
22 Spring Quartz如何动态配置时间_动态配置时间            < html:select  property ="hour"  styleId ="pmHours"  style ="display:none" >
23 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="13" > 13 </ html:option >
24 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="14" > 14 </ html:option >
25 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="15" > 15 </ html:option >
26 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="16" > 16 </ html:option >
27 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="17" > 17 </ html:option >
28 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="18" > 18 </ html:option >
29 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="19" > 19 </ html:option >
30 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="20" > 20 </ html:option >
31 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="21" > 21 </ html:option >
32 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="22" > 22 </ html:option >
33 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="23" > 23 </ html:option >
34 Spring Quartz如何动态配置时间_动态配置时间             < html:option  value ="0" > 0 </ html:option >
35 Spring Quartz如何动态配置时间_动态配置时间            </ html:select >  点
36 Spring Quartz如何动态配置时间_动态配置时间             < html:text  property ="minute"  name ="minute"  style ="width:20px;"  value ="0"  onchange ="valTime(this.value)"   />  分
37 Spring Quartz如何动态配置时间_动态配置时间             < html:text  property ="second"  name ="second"  style ="width:20px;"  value ="0"  onchange ="valTime(this.value)"   />  秒(0-59之间的整数)
38 Spring Quartz如何动态配置时间_动态配置时间       </ td >  
39 Spring Quartz如何动态配置时间_动态配置时间 </ tr >
40 Spring Quartz如何动态配置时间_动态配置时间

OK. 这样我们的页面设置就完成了。: - ) 
上回说到,我们的设置页面已经做好了,接下来就是将时间转换为Unix Cron Expression。

2) 将时间转换为Unix Cron Expression

需要ActionForm将页面表单数据映射到Action中,然后在Action中转换为cron expression:

 1 Spring Quartz如何动态配置时间_动态配置时间 SchedulerForm schedulerForm  =  (SchedulerForm) form;
 2 Spring Quartz如何动态配置时间_动态配置时间        String jobName  =  schedulerForm.getJobName();
 3 Spring Quartz如何动态配置时间_动态配置时间        String cronExpression  =   "" ;
 4 Spring Quartz如何动态配置时间_职场_89         String[] commonNeeds  =   {schedulerForm.getSecond(), schedulerForm.getMinute(), schedulerForm.getHour()} ;
 5 Spring Quartz如何动态配置时间_Quartz_92         String[] monthlyNeeds  =   {schedulerForm.getWeek(), schedulerForm.getDayOfMonth()} ;
 6 Spring Quartz如何动态配置时间_动态配置时间        String weeklyNeeds  =  schedulerForm.getDayOfWeek();
 7 Spring Quartz如何动态配置时间_动态配置时间        String userDefinedNeeds  =  schedulerForm.getDate();
 8 Spring Quartz如何动态配置时间_动态配置时间        String everyWhat  =  schedulerForm.getEveryWhat();
 9 Spring Quartz如何动态配置时间_动态配置时间         // 得到时间规则
10 Spring Quartz如何动态配置时间_动态配置时间         cronExpression  =  CronExpConversion.getCronExpression(everyWhat, commonNeeds,
11 Spring Quartz如何动态配置时间_动态配置时间                monthlyNeeds, weeklyNeeds, userDefinedNeeds);
12 Spring Quartz如何动态配置时间_动态配置时间

我定义了一个 规则类来处理转换规则(写得不是很好 能用就行 嘿嘿)
 1 Spring Quartz如何动态配置时间_动态配置时间
 2 Spring Quartz如何动态配置时间_Spring_103 /**
 3 Spring Quartz如何动态配置时间_休闲_105 * 页面设置转为UNIX cron expressions 转换类
 4 Spring Quartz如何动态配置时间_休闲_105 * CronExpConversion
 5 Spring Quartz如何动态配置时间_动态配置时间_107  */

 6 Spring Quartz如何动态配置时间_职场_108 public   class  CronExpConversion  {
 7 Spring Quartz如何动态配置时间_休闲_105    
 8 Spring Quartz如何动态配置时间_休闲_112      /**
 9 Spring Quartz如何动态配置时间_休闲_105     * 页面设置转为UNIX cron expressions 转换算法
10 Spring Quartz如何动态配置时间_休闲_105     *  @param  everyWhat
11 Spring Quartz如何动态配置时间_休闲_105     *  @param  commonNeeds 包括 second minute hour
12 Spring Quartz如何动态配置时间_休闲_105     *  @param  monthlyNeeds 包括 第几个星期 星期几
13 Spring Quartz如何动态配置时间_休闲_105     *  @param  weeklyNeeds  包括 星期几
14 Spring Quartz如何动态配置时间_休闲_105     *  @param  userDefinedNeeds  包括具体时间点
15 Spring Quartz如何动态配置时间_休闲_105     *  @return  cron expression
16 Spring Quartz如何动态配置时间_休闲_121      */

17 Spring Quartz如何动态配置时间_休闲_105     public   static  String convertDateToCronExp(String everyWhat,
18 Spring Quartz如何动态配置时间_休闲_105            String[] commonNeeds, String[] monthlyNeeds, String weeklyNeeds,
19 Spring Quartz如何动态配置时间_Spring_124             String userDefinedNeeds)  {
20 Spring Quartz如何动态配置时间_休闲_105        String cronEx  =   "" ;
21 Spring Quartz如何动态配置时间_休闲_105        String commons  =  commonNeeds[ 0 +   "   "   +  commonNeeds[ 1 +   "   "
22 Spring Quartz如何动态配置时间_休闲_105                 +  commonNeeds[ 2 +   "   " ;
23 Spring Quartz如何动态配置时间_休闲_105        String dayOfWeek  =   "" ;
24 Spring Quartz如何动态配置时间_动态配置时间_131          if  ( " monthly " .equals(everyWhat))  {
25 Spring Quartz如何动态配置时间_休闲_105             //  eg.: 6#3 (day 6 = Friday and "#3" = the 3rd one in the
26 Spring Quartz如何动态配置时间_休闲_105             //  month)
27 Spring Quartz如何动态配置时间_休闲_105             dayOfWeek  =  monthlyNeeds[ 1 ]
28 Spring Quartz如何动态配置时间_休闲_105                     +  CronExRelated.specialCharacters
29 Spring Quartz如何动态配置时间_休闲_105                            .get(CronExRelated._THENTH)  +  monthlyNeeds[ 0 ];
30 Spring Quartz如何动态配置时间_休闲_105            cronEx  =  (commons
31 Spring Quartz如何动态配置时间_休闲_105                     +  CronExRelated.specialCharacters.get(CronExRelated._ANY)
32 Spring Quartz如何动态配置时间_休闲_105                     +   "   "
33 Spring Quartz如何动态配置时间_休闲_105                     +  CronExRelated.specialCharacters.get(CronExRelated._EVERY)
34 Spring Quartz如何动态配置时间_休闲_105                     +   "   "   +  dayOfWeek  +   "   " ).trim();
35 Spring Quartz如何动态配置时间_Quartz_144         }
  else   if  ( " weekly " .equals(everyWhat))  {
36 Spring Quartz如何动态配置时间_休闲_105            dayOfWeek  =  weeklyNeeds;  //  1
37 Spring Quartz如何动态配置时间_休闲_105             cronEx  =  (commons
38 Spring Quartz如何动态配置时间_休闲_105                     +  CronExRelated.specialCharacters.get(CronExRelated._ANY)
39 Spring Quartz如何动态配置时间_休闲_105                     +   "   "
40 Spring Quartz如何动态配置时间_休闲_105                     +  CronExRelated.specialCharacters.get(CronExRelated._EVERY)
41 Spring Quartz如何动态配置时间_休闲_105                     +   "   "   +  dayOfWeek  +   "   " ).trim();
42 Spring Quartz如何动态配置时间_动态配置时间_153         }
  else   if  ( " userDefined " .equals(everyWhat))  {
43 Spring Quartz如何动态配置时间_休闲_105            String dayOfMonth  =  userDefinedNeeds.split( " - " )[ 2 ];
44 Spring Quartz如何动态配置时间_职场_157              if  (dayOfMonth.startsWith( " 0 " ))  {
45 Spring Quartz如何动态配置时间_休闲_105                dayOfMonth  =  dayOfMonth.replaceFirst( " 0 " "" );
46 Spring Quartz如何动态配置时间_休闲_121            }

47 Spring Quartz如何动态配置时间_休闲_105            String month  =  userDefinedNeeds.split( " - " )[ 1 ];
48 Spring Quartz如何动态配置时间_动态配置时间_163              if  (month.startsWith( " 0 " ))  {
49 Spring Quartz如何动态配置时间_休闲_105                month  =  month.replaceFirst( " 0 " "" );
50 Spring Quartz如何动态配置时间_休闲_121            }

51 Spring Quartz如何动态配置时间_休闲_105            String year  =  userDefinedNeeds.split( " - " )[ 0 ];
52 Spring Quartz如何动态配置时间_休闲_105             // FIXME 暂时不加年份 Quartz报错
53 Spring Quartz如何动态配置时间_休闲_170              /* cronEx = (commons + dayOfMonth + " " + month + " "
54 Spring Quartz如何动态配置时间_休闲_105                    + CronExRelated.specialCharacters.get(CronExRelated._ANY)
55 Spring Quartz如何动态配置时间_休闲_121                    + " " + year).trim(); */

56 Spring Quartz如何动态配置时间_休闲_105            cronEx  =  (commons  +  dayOfMonth  +   "   "   +  month  +   "   "
57 Spring Quartz如何动态配置时间_休闲_105                     +  CronExRelated.specialCharacters.get(CronExRelated._ANY)
58 Spring Quartz如何动态配置时间_休闲_105                     +   "   " ).trim();
59 Spring Quartz如何动态配置时间_休闲_121        }

60 Spring Quartz如何动态配置时间_休闲_105         return  cronEx;
61 Spring Quartz如何动态配置时间_休闲_121    }
    
62 Spring Quartz如何动态配置时间_动态配置时间_107}

63 Spring Quartz如何动态配置时间_动态配置时间
这样就将页面的时间设置转为了Cron Expression。
书接上回,上回说到,我们已经将页面的时间设置转为了Cron Expression,下面我记录了时间规则。

3) 记录时间规则

      我将时间规则存入数据库中,目的是为了生成历史日志,也可以存入XML文件中。当然您也可以省略此步,直接将转换后的规则放入相应的Quartz trigger中。

4) 更新任务触发器的时间设置

到了关键的一步了,也是最简单的一步,一个方法就可以实现了。
首先,我们需要通过trigger的名称得到一个CronTriggerBean;
其次,通过trigger的setCronExpression(String cronExp)方法将新的表达式注入;
最后,RESCHEDULE THE JOB,OK!

 1 Spring Quartz如何动态配置时间_休闲_182     /**
 2 Spring Quartz如何动态配置时间_休闲_105     * 自定义定时器调度时间
 3 Spring Quartz如何动态配置时间_休闲_105     *  @param
 triggerName 触发器名称
 4 Spring Quartz如何动态配置时间_休闲_105      *  @throws
 Exception 
 5 Spring Quartz如何动态配置时间_动态配置时间_107      */

 6 Spring Quartz如何动态配置时间_动态配置时间     public   void  updateNotificationInterval(String triggerName, String triggerId)
 7 Spring Quartz如何动态配置时间_Spring_189              throws  SchedulerException, ParseException 
{
 8 Spring Quartz如何动态配置时间_休闲_105         // 得到trigger

 9 Spring Quartz如何动态配置时间_休闲_105         CronTriggerBean trigger  =  (CronTriggerBean) scheduler.getTrigger(
10
Spring Quartz如何动态配置时间_休闲_105                triggerName, Scheduler.DEFAULT_GROUP);
11 Spring Quartz如何动态配置时间_休闲_105         // 得到cron expression        

12 Spring Quartz如何动态配置时间_休闲_105         String cronExpression  =  schedulerDAO.getCronExpression(triggerId);
13 Spring Quartz如何动态配置时间_休闲_105         // 设置trigger的时间规则

14 Spring Quartz如何动态配置时间_休闲_105         trigger.setCronExpression(cronExpression);
15 Spring Quartz如何动态配置时间_休闲_105         // 重置job

16 Spring Quartz如何动态配置时间_休闲_105         scheduler.rescheduleJob(triggerName, Scheduler.DEFAULT_GROUP, trigger);
17 Spring Quartz如何动态配置时间_动态配置时间_107    }

18 Spring Quartz如何动态配置时间_动态配置时间
至此,目的达到了,快乐的看着您的任务在您自定义的时间下快乐的执行,您是否也想像'Happy Feet'中那只快乐的企鹅一样,Show段踢踏呢 ; - D




PS:忘了说我的Quartz任务是怎么配置的了,罪过,罪过。

Spring Quartz如何动态配置时间_动态配置时间 < bean  id ="compareJob"
Spring Quartz如何动态配置时间_动态配置时间        class
="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean" >
Spring Quartz如何动态配置时间_动态配置时间        
< property  name ="targetObject"  ref ="compareService"   />
Spring Quartz如何动态配置时间_动态配置时间        
< property  name ="targetMethod"  value ="compare"   />
Spring Quartz如何动态配置时间_动态配置时间        
< property  name ="concurrent"  value ="false"   />
Spring Quartz如何动态配置时间_动态配置时间    
</ bean >  
Spring Quartz如何动态配置时间_动态配置时间
Spring Quartz如何动态配置时间_动态配置时间    
< bean  id ="compareTrigger"

Spring Quartz如何动态配置时间_动态配置时间        class
="org.springframework.scheduling.quartz.CronTriggerBean" >
Spring Quartz如何动态配置时间_动态配置时间        
< property  name ="jobDetail"  ref ="compareJob"   />
Spring Quartz如何动态配置时间_动态配置时间        
< property  name ="cronExpression" > Spring Quartz如何动态配置时间_动态配置时间            
Spring Quartz如何动态配置时间_动态配置时间            
< value > 0 39 16 20 * ? </ value >
Spring Quartz如何动态配置时间_动态配置时间        
</ property >
Spring Quartz如何动态配置时间_动态配置时间    
</ bean >
Spring Quartz如何动态配置时间_动态配置时间
Spring Quartz如何动态配置时间_动态配置时间
< bean  id ="schedulerFactory"
Spring Quartz如何动态配置时间_动态配置时间        class
="org.springframework.scheduling.quartz.SchedulerFactoryBean" >
Spring Quartz如何动态配置时间_动态配置时间        
< property  name ="triggers" >
Spring Quartz如何动态配置时间_动态配置时间            
< list >                     
                     < ref  local ="compareTrigger"   />

Spring Quartz如何动态配置时间_动态配置时间            
</ list >
Spring Quartz如何动态配置时间_动态配置时间        
</ property >
Spring Quartz如何动态配置时间_动态配置时间    
</ bean >


                                                                                    THE END