quartz

来源:互联网 发布:淘宝代付能不能用花呗 编辑:程序博客网 时间:2024/04/28 15:08

quartz 详细教程

http://liuwei-git-com-cn.javaeye.com/blog/323705

 

1 helloworld

 

<!—要调度的对象-->

<bean id="testQuarz" class="springtimer.TestQuarz" />

<!--定义定时执行testQuarz 这个bean中的sayHello()方法-->
<bean id="helloworldTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
        <property name="targetObject">  
            <ref bean="testQuarz" />  
        </property>  
        <property name="targetMethod">  
            <value>sayHello</value>  
        </property>  
</bean>

<!--触发器的bean的设置,在这里我们设置了我们要触发的jobDetail是哪个。这里我们定义了要触发的jobDetail是helloworldTask,即触发器去触发哪个bean..并且我们还定义了触发的时间:每天5:17pm-->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">  
        <property name="jobDetail">  
            <ref bean="helloworldTask" />  
        </property>  
        <property name="cronExpression">  
            <!-- 关键在配置此表达式 -->  
            <value>0 17 17 * * ?</value>  
        </property>  
</bean>   

<!--管理触发器的总设置,管理我们的触发器列表,可以在bean的list中放置多个触发器。-->   
<bean autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
        <property name="triggers">  
            <list>  
                <ref local="cronTrigger" />  
            </list>  
        </property>  
</bean>  

 

public class TestQuarz {  
  public void sayHello() {  
    System.out.println("HelloWorld! ");  
  }
}

 

2 quzrtz时间配置

Field Name  | Mandatory?    | Allowed Values    | Allowed Special Characters  

Seconds          |  YES        |  0-59           |  , - * /   

Minutes          |  YES        |  0-59           |  , - * /   

Hours            |  YES        |  0-23           |  , - * /   

Day of month    |  YES         |  1-31           |  , - * ? / L W C   

Month            |  YES        |  1-12 or JAN-DEC   |  , - * /   

Day of week |  YES         |  1-7 or SUN-SAT    |  , - * ? / L C #   

Year             |  NO         |  empty, 1970-2099  |  , - * /  

 

Cron表达式的时间字段除允许设置数值外,还可使用一些特殊的字符,提供列表、范围、通配符等功能,细说如下:

●星号(*):可用在所有字段中,表示对应时间域的每一个时刻,例如,*在分钟字段时,表示“每分钟”;

●问号(?):该字符只在日期和星期字段中使用,它通常指定为“无意义的值”,相当于点位符;

●减号(-):表达一个范围,如在小时字段中使用“10-12”,则表示从10到12点,即10,11,12;

●逗号(,):表达一个列表值,如在星期字段中使用“MON,WED,FRI”,则表示星期一,星期三和星期五;

●斜杠(/):x/y表达一个等步长序列,x为起始值,y为增量步长值。如在分钟字段中使用0/15,则表示为0,15,30和45秒,而5/15在分钟字段中表示5,20,35,50,你也可以使用*/y,它等同于0/y;

●L:该字符只在日期和星期字段中使用,代表“Last”的意思,但它在两个字段中意思不同。L在日期字段中,表示这个月份的最后一天,如一月的31号,非闰年二月的28号;如果L用在星期中,则表示星期六,等同于7。但是,如果L出现在星期字段里,而且在前面有一个数值X,则表示“这个月的最后X天”,例如,6L表示该月的最后星期五;

●W:该字符只能出现在日期字段里,是对前导日期的修饰,表示离该日期最近的工作日。例如15W表示离该月15号最近的工作日,如果该月15号是星期六,则匹配14号星期五;如果15日是星期日,则匹配16号星期一;如果15号是星期二,那结果就是15号星期二。但必须注意关联的匹配日期不能够跨月,如你指定1W,如果1号是星期六,结果匹配的是3号星期一,而非上个月最后的那天。W字符串只能指定单一日期,而不能指定日期范围;

●LW组合:在日期字段可以组合使用LW,它的意思是当月的最后一个工作日;

●井号(#):该字符只能在星期字段中使用,表示当月某个工作日。如6#3表示当月的第三个星期五(6表示星期五,#3表示当前的第三个),而4#5表示当月的第五个星期三,假设当月没有第五个星期三,忽略不触发;

● C:该字符只在日期和星期字段中使用,代表“Calendar”的意思。它的意思是计划所关联的日期,如果日期没有被关联,则相当于日历中所有日期。例如5C在日期字段中就相当于日历5日以后的第一天。1C在星期字段中相当于星期日后的第一天。

Cron表达式对特殊字符的大小写不敏感,对代表星期的缩写英文大小写也不敏感。

 

 

例子列表如下:
表达式 解释
0 0 12 * * ? 在每天中午12:00触发
0 15 10 ? * * 每天上午10:15 触发
0 15 10 * * ? 每天上午10:15 触发
0 15 10 * * ? * 每天上午10:15 触发
0 15 10 * * ? 2005 在2005年中的每天上午10:15 触发
0 * 14 * * ? 每天在下午2:00至2:59之间每分钟触发一次
0 0/5 14 * * ? 每天在下午2:00至2:59之间每5分钟触发一次
0 0/5 14,18 * * ? 每天在下午2:00至2:59和6:00至6:59之间的每5分钟触发一次
0 0-5 14 * * ? 每天在下午2:00至2:05之间每分钟触发一次
0 10,44 14 ? 3 WED 每三月份的星期三在下午2:00和2:44时触发
0 15 10 ? * MON-FRI 从星期一至星期五的每天上午10:15触发
0 15 10 15 * ? 在每个月的每15天的上午10:15触发
0 15 10 L * ? 在每个月的最后一天的上午10:15触发
0 15 10 ? * 6L 在每个月的最后一个星期五的上午10:15触发
0 15 10 ? * 6L 2002-2005 在2002, 2003, 2004 and 2005年的每个月的最后一个星期五的上午10:15触发
0 15 10 ? * 6#3 在每个月的第三个星期五的上午10:15触发
0 0 12 1/5 * ? 从每月的第一天起每过5天的中午12:00时触发
0 11 11 11 11 ? 在每个11月11日的上午11:11时触发.

 

 

3 设置动态定时任务。

  1. <bean id="scheduleInfoManager" class="com.lively.happyoa.jobs.webapp.manager.scheduleInfoManager">     
  2.          <property name="scheduler" ref="schedulerFactory"/>     
  3.      </bean>     
  4.     <bean id="schedulerJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">     
  5.          <property name="targetObject" ref="scheduleInfoManager"/>     
  6.          <property name="targetMethod" value="reScheduleJob"/>     
  7.          <property name="concurrent" value="false"/>     
  8.     </bean>     
  9.     <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean" >     
  10.           <property name="jobDetail" ref="schedulerJobDetail"/>     
  11.           <property name="cronExpression">     
  12.               <value>0/10 * * * * ?</value>     
  13.           </property>     
  14.       </bean>     
  15.      <bean id="schedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">     
  16.          <property name="triggers">     
  17.              <list>     
  18.                 <ref local="cronTrigger"/>     
  19.              </list>     
  20.          </property>     
  21. </bean> 

public class ScheduleInfoManager {

 private Scheduler scheduler;     
    // 设值注入,通过setter方法传入被调用者的实例scheduler     
    public void setScheduler(Scheduler scheduler) {     
        this.scheduler = scheduler;     
    }     
   
 public void reScheduleJob() throws SchedulerException, ParseException {     
        // 运行时可通过动态注入的scheduler得到trigger     
        CronTriggerBean trigger = (CronTriggerBean)
         scheduler.getTrigger("cronTrigger", Scheduler.DEFAULT_GROUP);
     
         String dbCronExpression = getCronExpressionFromDB();     
         String originConExpression = trigger.getCronExpression();     
         // 判断从DB中取得的任务时间(dbCronExpression)和现在的quartz线程中的任务时间(originConExpression)是否相等     
         // 如果相等,则表示用户并没有重新设定数据库中的任务时间,这种情况不需要重新rescheduleJob     
         if(!originConExpression.equalsIgnoreCase(dbCronExpression)){     
            trigger.setCronExpression(dbCronExpression);     
            scheduler.rescheduleJob("cronTrigger", Scheduler.DEFAULT_GROUP, trigger);     
         }     
         // 下面是具体的job内容,可自行设置     
         // executeJobDetail();
         System.out.println("executeJobDetail");
 }   
 
 private String getCronExpressionFromDB(){     
//        String sql="from ScheduleInfo scheduleInfo where 1=1 ";     
//        sql=sql+" and scheduleInfo.infoId = '"+"1" + "'";     
//        List scheduleList = scheduleInfoManager.queryScheduleInListBySql(sql);     
//        ScheduleInfo scheduleInfo = (ScheduleInfo)scheduleList.get(0);     
        String dbCronExpression = "0 0/1 13 * * ?";     
       return dbCronExpression;     
 } 
 

}

 

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 人被全险车撞了怎么办 被全险车撞了怎么办 驾驶证和行驶证遗失怎么办 户口迁移身份证没换驾照怎么办 户口迁回时身份证掉了怎么办 户口毕业托管身份证掉了怎么办 身份证和户口都掉了怎么办 毕业生户口迁回原籍没身份证怎么办 落户上海后怎么办医保卡 小车临时牌过期了怎么办 驾驶证地址错了一个字怎么办 驾驶证名下车辆有违章怎么办 a2如果扣12分怎么办 b2一次超速12分怎么办 b2本扣了12分怎么办 驾照扣了27分怎么办 大车一次扣12分怎么办 a2驾照扣10分怎么办 驾驶证强制降级没给驾驶证怎么办 6P升11.2卡了怎么办 b2驾照记满12分怎么办 c1驾驶证没分了怎么办 驾照扣了15分怎么办 驾驶证暂扣六个月后怎么办 醉驾交警不通知怎么办 参军后地方驾驶证年审怎么办 军人驾驶证到期身份证注销了怎么办 资格证脱审30天怎么办 驾驶证c证扣6分怎么办 驾照被扣了9分怎么办 驾驶证被扣了9分怎么办 a2驾驶本扣3分怎么办 c1e没过扣了满分怎么办 c1一下扣12分怎么办 换证体检过不了怎么办 唐山驾驶本到期换本怎么办 北京居住证变更地址了怎么办 眼睛弱视驾驶证换证不了怎么办? 驾照的分扣完了怎么办 驾照被扣了3分怎么办 交警扣了行驶证怎么办