定时任务Quartz Scheduler概念详解

原创地址:http://blog.sina.com.cn/s/blog_5f9beca40101cmfq.html



首先认识明确几个关于Quartz Scheduler的概念。
 
调度器:负责对用户定义的所有任务进行调度的类。
 
触发器:触发器在逻辑上包含两个属性,即如何触发该调度器和触发该调度器之后进行怎么样的操作,在Quartz Scheduler中触发器的触发事件为特定时间。时间可以为一个时间段,也可以为时间点。
 
任务(jobDetail):触发器在被触发后进行的操作,可以指定任意一个类的某个方法。触发器被触发之后将调用该类的指定方法。
 
 
 
在spring.jar包中包含了对Quartz Scheduler进行操作的类:
 
1.       org.springframework.scheduling.quartz.SchedulerFactoryBean
 
该类负责在spring容器中创建调度器。其最重要的属性有triggers,这是一个List定义了该调度器负责调度的所有触发器。还有一个属性为autoStartup,该类指定是否在spring构造该类完成之后开始执行调度。一般设置为true。
 
2.       org.springframework.scheduling.quartz.CronTriggerBean
 
该类负责在spring容器中创建一个触发器,该类的ID应该在某个SchedulerFactoryBean属性的List中被引用,这样这个触发器才能保证被某个指定调度器调度。在该类中应该指定两个属性,触发规则(cronExpression)和触发要执行任务(jobDetail)。触发规则(cronExpression)是一个指定规则的字符串,指定了在什么时候触发该触发器。在下文中介绍,jobDetail属性配置为一个MethodInvokingJobDetailFactoryBean,由MethodInvokingJobDetailFactoryBean负责生成任务类。
 
3.       org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean
 
该类负责生成具体的任务,其实任务非常简单,只需要指定某个对象的某个方法即可,在触发器触发时,即调用指定对象的指定方法。
 
 
 
代码示例
 
spring配置文件
 

 

<?xml version="1.0" encoding="UTF-8"?>
 
 
 
<beans xmlns="http://www.springframework.org/schema/beans"
 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
 
    xmlns:tx="http://www.springframework.org/schema/tx"
 
    xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 
              http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-2.5.xsd
 
              http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
 
    <!-- 任务调度器生成器,Spring生成具有指定属性调度器对象 -->
 
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
 
       <!-- 生成的调度器所管理的所有触发器 -->
 
       <property name="triggers">
 
           <list>
 
              <ref bean="testTrigger" />
 
           </list>
 
       </property>
 
       <property name="autoStartup" value="true" />
 
    </bean>
    <!-- 触发器生成器类,用被指定的调度器调度生成指定规则的触发器对象 -->
 
    <bean id="testTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
 
       <!-- 触发后要做的操作,这个操作由spring管理,只需要指定一个MethodInvokingJobDetailFactoryBean -->
 
       <property name="jobDetail" ref="testJobDetail" />
 
       <!-- 触发规则,这里的触发规则是每隔2秒钟后触发一次 -->
 
       <property name="cronExpression" value="*/2 * * * * ?" /><!--  -->
 
    </bean>
 
    <!--任务生成器,由spring管理,只需要指定其对应的对象和方法即可,任务的执行即是某个对象调用一个方法 -->
 
    <bean id="testJobDetail"
 
        class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
 
       <!-- 指定该任务对应的调用对象,这个对象所属的类无需实现任何接口-->
 
        <property name="targetObject" ref="testJob" />
 
       <!-- 指定在targetObject对象中某个的方法 -->
 
       <property name="targetMethod" value="execute" />
 
       <!-- 是否允许任务并发执行。当值为false时,表示必须等到前一个线程处理完毕后才再启一个新的线程 -->
 
       <property name="concurrent" value="false" />
 
    </bean>
 
    <!-- 一个普通的类,用于测试 -->
 
    <bean id="testJob" class="com.javacat.spring.TestJob"/>
 
</beans>
 
用于测试的类:

package com.javacat.spring;
 
import java.util.Date;
 
public class TestJob {
 
    private static int count = 0;
 
    public void execute() {
 
       try {
 
           Thread.sleep(3000);
 
           System.out.println(new Date() + "--任务I第"+ ++count +"次被触发");
 
         
 
       } catch (Exception ex) {
 
           ex.printStackTrace();
 
       }
 
    }
 
 
下面介绍如何在spring中定义触发器的生成规则:
 
 生成规则cronExpression属性是一个空格隔开的字符串,每个部分分别标识指定的时间的秒,分,时,日,月,周几,年属性。先看一个表格
 

 

字段名
 

允许的值
 

允许的特殊字符
 

 


 

0-59
 

- * /
 

 


 

0-59
 

- * /
 

 


 

0-23
 

- * /
 

 


 

1-31
 

- * / L W C ?
 

 

 
 

 
 
 

1-12 or JAN-DEC
 

- * /
 

 

周几
 

1-7(1对应星期天)or SUN-SAT
 

- * ? / L C #
 

 

年(可选字段)
 

1970-2099 empty
 

- * /
 

 
 
字符释义
 
“?”字符:表示不确定的值
 
“,”字符:指定数个值
 
“-”字符:指定一个值的范围
 
“/”字符:指定一个值的增加幅度。n/m表示从n开始,每次增加m
 
“L”字符:用在日表示一个月中的最后一天,用在周表示该月最后一个星期X
 
“W”字符:指定离给定日期最近的工作日(周一到周五)
 
“#”字符:表示该月第几个周X。6#3表示该月第3个周五
 
 
 
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 * * ?


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值