Quartz是一个任务进度管理器,可以与任何其他软件系统集成或者一起使用。是用一个小Java库发布的文件(.jar文件),这个库文件包含了所有Quartz核心功能。这些功能的主要接口(API)是Scheduler接口。它提供了简单的操作,例如:将任务纳入日程或者从日程中取消,开始/停止/暂停日程进度。

        以top调用错误统计定时发送邮件任务为例介绍Quartz定时任务的Spring依赖注入配置方法:

        1.定时目标类TaoReportTask的bean配置(详见eshop/eshop/src/bean/spring-app-task.xml)。

                

<bean id="taoReportTask" class="com.alibaba.eshop.task.tool.task.TaoReportTask">
                    <property name="taskHost">
                        <!—执行任务的服务器的ip -->
                      <value>${task.taoreport.ip}</value>
                    </property>
                    <property name="manager">
                       <ref bean="manager"/>
                    </property>
                    <property name="mailSender" ref="mailSender" />
                 </bean>

        2.Scheduler的配置(详见eshop/neweshop/src/spring/spring-task-quartz.xml),Scheduler包含一个Trigger列表,每个Trigger表示一个作业。

               

<bean id="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"autowire="no">
                   <property name="triggers">
                       <list>
                                <!-- 淘宝错误统计作业-->
                          <ref bean="doTaoReportTrigger"></ref>
                       </list>
                     </property>
                    <property name="configLocation" value="classpath:quartz.properties"/>
                 </bean>

 

         3.Trigger的配置(详见eshop/eshop/src/bean/spring-app-task.xml)。

        

<bean id="doTaoReportTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
                  <property name="jobDetail">
                     <ref bean="doTaoReportJobDetail"/>
                  </property>
                  <property name="cronExpression">
                <!—Cron表达式,表示每天凌晨执行一次任务 -->
                     <value> 0 0 0 * * ?</value>
                  </property>
        </bean>

        说明:

                 1)Cron表达式的格式:秒 分 时 日 月 周 年(可选)。

                

字段名                 允许的值                        允许的特殊字符  
                       秒                         0-59                               , - * /  
                       分                         0-59                               , - * /  
                      小时                   0-23                                  , - * /  
                      日                         1-31                               , - * ? / L W C  
                      月                         1-12 or JAN-DEC          , - * /  
                      周几                     1-7 or SUN-SAT            , - * ? / L C #  
                     年 (可选字段)     empty, 1970-2099             , - * /
                   “?”字符:表示不确定的值
                   “,”字符:指定数个值
                   “-”字符:指定一个值的范围
                   “/”字符:指定一个值的增加幅度。n/m表示从n开始,每次增加m
                   “L”字符:用在日表示一个月中的最后一天,用在周表示该月最后一个星期X
                  “W”字符:指定离给定日期最近的工作日(周一到周五)
                   “#”字符:表示该月第几个周X。6#3表示该月第3个周五

                 2)Cron表达式范例:

                

每隔5秒执行一次:*/5 * * * * ?
                     每隔1分钟执行一次:0 */1 * * * ?
                     每天23点执行一次:0 0 23 * * ?
                     每天凌晨1点执行一次:0 0 1 * * ?
                     每月1号凌晨1点执行一次:0 0 1 1 * ?
                     每月最后一天23点执行一次:0 0 23 L * ?
                     每周星期天凌晨1点实行一次:0 0 1 ? * L
                     在26分、29分、33分执行一次:0 26,29,33 * * * ?
                     每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?

     4. JobDetail配置(详见eshop/eshop/src/bean/spring-app-task.xml),其中C2CMethodInvokingJobDetailFactoryBean 继承了spring中的  

   

org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean。
    <bean id="doTaoReportJobDetail"
        class="com.alisoft.c2c.aop.C2CMethodInvokingJobDetailFactoryBean">
         <!-- 是否允许任务并发执行。当值为false时,表示必须等到前一个线程处理完毕后才再启一个新的线程 --> 
        <property name="concurrent">
            <value>false</value>
        </property>
        <!—任务目标类 --> 
        <property name="targetObject">
            <ref bean="taoReportTask" />
        </property>
      <!—任务目标类要调用的方法-->
        <property name="targetMethod">
            <value>doTopReport</value>
        </property>
     </bean>