文章目录
  1. 1. 两种不同的任务调度触发时机
  2. 2. 编写作业类
  3. 3. 配置applicationContext.xml文件
  4. 4. 配置Web.xml文件

Quartz 是一个强大的企业级 Schedule 工具,也是目前最好的开源 Schedule 工具。Spring中也集成了quartz的应用,下面就讲一下如何在spring中使用quartz。

两种不同的任务调度触发时机

  1. 每隔指定时间则触发一次,对应的调度器为

    org.springframework.scheduling.quartz.SimpleTriggerBean
    
  2. 每到指定时间则触发一次,对应的调度器为

    org.springframework.scheduling.quartz.CronTriggerBean
    
    一个cron表达式有到少6个(也可能是7个)由空格分隔的时间元素.从左到右,这些元素的定义如下:  
            1.秒(0-59)  
            2.分钟(0-59)  
            3.小时(0-23)  
            4.月份中的是期(1-31)  
            5.月份(1-12或SUN-DEC)  
            6.星期中的日期(1-7或SUN-SAT)  
            7.年份(1970-2099)   
            例子:  
            0 0 10,14,16 * * ? 每天上午10点,下午2点和下午40 0,15,30,45 * 1-10 * ? 每月前10天每隔15分钟  
            30 0 0 1 1 ? 2012201211日午夜过30秒时  
            0 0 8-5 ? * MON-FRI 每个工作日的工作时间  
    

    通配符说明:

    * 表示所有值. 例如:在分的字段上设置 "*",表示每一分钟都会触发。
    ? 表示不指定值。使用的场景为不需要关心当前设置这个字段的值。例如:要在每月的10号触发一个操作,但不关心是周几,所以需要周位置的那个字段设置为"?" 具体设置为 0 0 0 10 * ?
    - 表示区间。例如 在小时上设置 "10-12",表示 10,11,12点都会触发。
    , 表示指定多个值,例如在周字段上设置 "MON,WED,FRI" 表示周一,周三和周五触发
    / 用于递增触发。如在秒上面设置"5/15" 表示从5秒开始,每增15秒触发(5,20,35,50)。 在月字段上设置'1/3'所示每月1号开始,每隔三天触发一次。
    L 表示最后的意思。在日字段设置上,表示当月的最后一天(依据当前月份,如果是二月还会依据是否是润年[leap]), 在周字段上表示星期六,相当于"7""SAT"。如果在"L"前加上数字,则表示该数据的最后一个。例如在周字段上设置"6L"这样的格式,则表示“本月最后一个星期五" 
    W 表示离指定日期的最近那个工作日(周一至周五). 例如在日字段上设置"15W",表示离每月15号最近的那个工作日触发。如果15号正好是周六,则找最近的周五(14号)触发, 如果15号是周未,则找最近的下周一(16号)触发.如果15号正好在工作日(周一至周五),则就在该天触发。如果指定格式为 "1W",它则表示每月1号往后最近的工作日触发。如果1号正是周六,则将在3号下周一触发。(注,"W"前只能设置具体的数字,不允许区间"-").
    小提示     
    
    'L'和 'W'可以一组合使用。如果在日字段上设置"LW",则表示在本月的最后一个工作日触发(一般指发工资 ) 
    
    # 序号(表示每月的第几个周几),例如在周字段上设置"6#3"表示在每月的第三个周六.注意如果指定"#5",正好第五周没有周六,则不会触发该配置(用在母亲节和父亲节再合适不过了)
    

下面简单演示一下Spring对Quartz的用法,不过先要去www.quartz-scheduler.org下载相关依赖。

例子:作业类继承org.springframework.scheduling.quartz.QuartzJobBean类,每到指定时间则触发一次

编写作业类

public class TestJob extends QuartzJobBean{

    @Override
    protected void executeInternal(JobExecutionContext arg0)
            throws JobExecutionException {
        //编写想要定时执行的任务。
        System.out.println("大家好,请叫我 TestJob!");
    }

}

配置applicationContext.xml文件

  1. 配置作业类,定义工作类和方法

    <!-- 作业使用继承QuartzJobBean的方式  -->
    <bean name="myjob" class="org.springframework.scheduling.quartz.JobDetailBean">
        <property name="jobClass" value="edu.nju.healthclub.timer.TestJob" />
         <!-- 为任务Bean注入属性 -->
        <property name="jobDataAsMap">
            <map>
                <!--程序在10s之后首次调用你的TestJob-->
                <entry key="timeout" value="10" />
                <!--   spring 的依赖注入  -->  
                <!-- <entry key="service"><ref local="MemberServiceImpl"/></entry>  -->  
            </map>
        </property>
    </bean>
    
  2. 配置作业调度的触发方式

    到指定时间触发器

    <!-- 定义触发器来管理任务Bean -->
    <bean id="myTrigger"
        class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail">
            <!-- 上面创建的任务调度对象 -->
            <ref bean="myjob" />
        </property>
        <property name="cronExpression">
              <value>0 0 6 * * ?</value>
        </property>
    </bean>
    

    隔指定时间触发器

    <bean id="myTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
        <property name="jobDetail">
            <ref bean="myjob"/>
        </property>
        <property name="startDelay">  
            <value>6000</value>  
            <!--    这里是服务启动后延时多少时间,开始计时任务,单位ms-->  
        </property>  
        <!-- 每隔1s中执行一次 -->
        <property name="repeatInterval">
            <value>1000</value>
        </property>
    
    </bean>
    
  3. 配置调度工厂

    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
          <list>
            <ref bean="myTrigger"/>
          </list>
        </property>
    </bean>
    

配置Web.xml文件

<listener>  
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
</listener> 
文章目录
  1. 1. 两种不同的任务调度触发时机
  2. 2. 编写作业类
  3. 3. 配置applicationContext.xml文件
  4. 4. 配置Web.xml文件