Quartz任务调度器

简介: 在使用jdk的timer时发现无法满足开发需求;即无法在指定的日期进行执行任务。 这便引入一个优秀的开源任务调度框架“quartz”。   这里加入的是quartz-1.8.6版本。Quart的官网:http://www.quartz-scheduler.org/;项目中的框架的spring是spring 3.0版本无法集成quartz 2.x及其后续版本;所以这里用quartz 1.8.6版本。
在使用 jdk timer 时发现无法满足开发需求;即无法在指定的日期进行执行任务。
这便引入一个优秀的开源任务调度框架“ quartz ”。
 
这里加入的是quartz-1.8.6版本。Quart 的官网: http://www.quartz-scheduler.org/;项目中的框架的 spring spring 3.0 版本无法集成 quartz 2.x 及其后续版本;所以这里用 quartz 1.8.6 版本。
关于在spring中使用quartz,可以在spring文档中查看,spring4.0.4文档说,只spring3.2以后只支持quartz2.+。

 

spring中整合Quartz进行任务调度;首先将需要用到的jar包引入项目的lib目录下: 

“org.springframework.context.support-3.0.2.RELEASE.jar”:此包是spring根据quartz中的主要类进行再次封装成具有bean风格的类

“quartz-1.8.6.jar”:quartz的核心包

 

要在spring 中利用quartz调度任务;需要配置三个bean1、制定任务信息 bean

  •    ① 设置执行对象
  •    ② 设置执行对象中对应的执行方法
  •    ③ 是否可以同步执行
  •  
  • 2、制定任务执行时机(执行触发器) bean
  •    2.1、简单触发器(SimpleTrigger)
  •    ① 设置任务详细
  •    ② 设置任务延迟执行时间
  •    ③ 设置任务执行频率
  •  
  •    2.2、任务触发器(CronTrigger)
  •    ① 设置任务详细
  •    ② 设置执行时机(cronExpression)
  •     cronExpression:秒 分 时 日 月 周 年(可选)
  • 3、设置任务调度工厂 bean
  •    设置触发器们
 
 
package com.intsmaze.quartz;
 
public class QuartzTask {
 
    public void doSimpleTriggerTask() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("doing simpleTrigger task..." + sdf.format(new Date()));
    }
 
    public void doCronTriggerTask() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("doing cronTrigger task..." + sdf.format(new Date()));
    }    
}  
 

 

1、 jobDetail 任务详细信息;包括调用哪个类;类中的哪个方法;执行时是否可并行执行任务。

 

    <!-- 注册一个普通bean -->
   <bean id="quartzTask" class="com.intsmaze.quartz.QuartzTask"></bean>
     
   <!-- 1、制定任务信息信息 -->
   <bean id="jobDetail1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
              <!-- 设置执行对象 -->
              <property name="targetObject" ref="quartzTask"></property>
              <!-- 设置执行对象中对应的执行方法 -->
              <property name="targetMethod" value="doSimpleTriggerTask"></property>
              <!-- 是否可以同步执行;不可同步执行 (意思是:比如三秒执行一个任务,一个任务执行三秒还没有执行完,如果设置可以同步,那么上一个任务没有执行完,它会开启一个新线程执行下一个任务设置为不同步,那么必须等到上一个执行完才执行下一个任务。)-->
              <property name="concurrent" value="false"></property>
   </bean>
   <bean id="jobDetail2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
              <!-- 设置执行对象 -->
              <property name="targetObject" ref="quartzTask"></property>
              <!-- 设置执行对象中对应的执行方法 -->
              <property name="targetMethod" value="doCronTriggerTask"></property>
              <!-- 是否可以同步执行;不可同步执行 -->
              <property name="concurrent" value="false"></property>
   </bean>  

 

 

2、 trigger 任务调度触发器;主要用于定义jobDetail什么时候执行。

触发器最常用的有两种:简单触发器 SimpleTrigger  和任务触发器 CronTrigger 
SimpleTrigger jdk timer 类似,只能指定任务执行以什么样的频率执行,但无法制定精确的执行时间
CronTrigger 既可以执行简单触发器所制定的以频率来执行的时间,也可以制定复杂的时间计划来执行。如可制定:每个月的最后一天的 15 点来执行相关任务。

  <!-- 2、制定任务执行时机(任务执行触发器) -->

   <bean id="simplerTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
           <!-- 设置任务详细 -->
           <property name="jobDetail" ref="jobDetail1"></property>
           <!-- 设置任务延迟执行时间 ;延迟2秒执行-->
           <property name="startDelay" value="2000"></property>
           <!-- 设置任务执行频率;执行频率为每4秒执行一下 -->
           <property name="repeatInterval" value="2000"></property>
   </bean>
   <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
           <!-- 设置任务详细 -->
           <property name="jobDetail" ref="jobDetail2"></property>
           <!-- 设置任务执行时机,cron表达式 -->
           <property name="cronExpression" value="* * * 18c * ?"></property>
   </bean>

   

 

 

3、 schedulerFactory 任务调度工厂;用于调度各个任务触发器。

 

   <!-- 3、设置调度工厂 -->
   <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
           <property name="triggers">
               <list>
                   <!-- <ref bean="simplerTrigger"/> -->
                   <ref bean="cronTrigger"/>
               </list>
           </property>

   </bean>  

 

 

启动spring容器,就会自动执行任务调度了。

 

 

CronTrigger中的 cronExpression 表达式属性中接收的内容:

在表达式中时间格式间用空格隔开,每个时间表示:秒 分钟 小时 日 月 周 年(可选填)

日和周不能同时出现,因为会不一致导致错误。

 

可出现的值和符合:

 

'*' 字符可以用于所有字段,在“分”字段中设为"*"表示"每一分钟"的含义

 

'?' 字符可以用在“日”和“周几”字段它用来指定 '不明确的值'. 这在你需要指定这两个字段中的某一个值而不是另外一个的时候会被用到。在后面的例子中可以看到其含义。

 

'-' 字符被用来指定一个值的范围,比如在“小时”字段中设为"10-12"表示"10点到12".

 

',' 字符指定数个值。比如在“周几”字段中设为"MON,WED,FRI"表示"the days Monday, Wednesday, and Friday".

 

'/' 字符用来指定一个值的的增加幅度比如在“秒”字段中设置为"0/15"表示"0, 15, 30, 和 45"。而 "5/15"则表示"5, 20, 35, 和 50". '/'前加"*"字符相当于指定从0秒开始每个字段都有一系列可以开始或结束的数值。对于“秒”和“分”字段来说,其数值范围为059,对于“小时”字段来说其为023, 对于“日”字段来说为031, 而对于“月”字段来说为112"/"字段仅仅只是帮助你在允许的数值范围内从开始"n"的值。 因此对于“月”字段来说"7/6"只是表示7月被开启而不是“每六个月”请注意其中微妙的差别。

 

'L'字符可用在“日”和“周几”这两个字段。它是"last"的缩写但是在这两个字段中有不同的含义。例如,“日”字段中的"L"表示"一个月中的最后一天—— 对于一月就是31号对于二月来说就是28号(非闰年)。而在“周几”字段中它简单的表示"7" or "SAT",但是如果在“周几”字段中使用时跟在某个数字之后它表示"该月最后一个星期×—— 比如"6L"表示"该月最后一个周五"。当使用'L'选项时,指定确定的列表或者范围非常重要,否则你会被结果搞糊涂的。

 

'W' 可用于“日”字段。用来指定历给定日期最近的工作日(周一到周五。比如你将“日”字段设为"15W",意为: "离该月15号最近的工作日"。因此如果15号为周六,触发器会在14号即周五调用。如果15号为周日触发器会在16号也就是周一触发。如果15号为周二,那么当天就会触发。然而如果你将“日”字段设为"1W", 而一号又是周六触发器会于下周一也就是当月的3号触发,因为它不会越过当月的值的范围边界。'W'字符只能用于“日”字段的值为单独的一天而不是一系列值的时候。

 

'L''W'可以组合用于“日”字段表示为'LW',意为"该月最后一个工作日"

 

'#' 字符可用于“周几”字段。该字符表示“该月第几个周×”,比如"6#3"表示该月第三个周五( 6表示周五而"#3"该月第三个)。再比如: "2#1" = 表示该月第一个周一而 "4#5" = 该月第五个周三。注意如果你指定"#5"该月没有第五个“周×”,该月是不会触发的。

 

'C' 字符可用于“日”和“周几”字段,它是"calendar"的缩写。它表示为基于相关的日历所计算出的值(如果有的话)。如果没有关联的日历那它等同于包含全部日历。“日”字段值为"5C"表示"日历中的第一天或者5号及其以后",“周几”字段值为"1C"则表示"日历中的第一天或者周日及其以后"

 

对于“月份”字段和“周几”字段来说合法的字符都不是大小写敏感的。

作者: intsmaze(刘洋)
老铁,你的--->推荐,--->关注,--->评论--->是我继续写作的动力。
微信公众号号:Apache技术研究院
由于博主能力有限,文中可能存在描述不正确,欢迎指正、补充!
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
相关文章
|
Java 调度 Maven
定时任务组件Quartz
定时任务组件Quartz
定时任务组件Quartz
|
存储 运维 Java
分布式定时任务-Quartz
分布式定时任务-Quartz
分布式定时任务-Quartz
|
存储 Java 数据库连接
Quartz:任务调度实现原理
Quartz:任务调度实现原理
1089 0
Quartz:任务调度实现原理
|
Java 调度 Spring
调度介绍 - Quartz是怎么调起来的
Quartz调度核心类QuartzSchedulerThread,是一个线程。在线程启动后,通过while循环不断去触发作业的执行。ps:源码版本2.3.2,
调度介绍 - Quartz是怎么调起来的
调度介绍 - Quartz
众所周知,Quartz作为知名的企业级调度框架,提供了丰富的特性。本文通过一个简单的示例,介绍下quartz在springboot的应用和quartz部分基本概念,并展示了quartz调度作业的基本过程。
调度介绍 - Quartz
Quartz3定时任务学习之异步调度器
Quartz3定时任务学习之异步调度器 Quartz3与Quartz2的主要区别有两点: 1,Quartz3将它的资源类库拆的更细了,比如,想使用Quartz3开发,最少要引用Quartz,Quartz.Jobs,Quartz.Plugins这三个类库。 2,Quartz3整体上使用的是异步创建实例,所以我们使用时就必须要async,await的语法。 下面我们用Quartz3来做一个任务调度。
Quartz3定时任务学习之异步调度器
|
监控 关系型数据库 调度
Spring整合Quartz分布式调度
为了保证应用的高可用和高并发性,一般都会部署多个节点;对于定时任务,如果每个节点都执行自己的定时任务,一方面耗费了系统资源,另一方面有些任务多次执行,可能引发应用逻辑问题,所以需要一个分布式的调度系统,来协调每个节点执行定时任务。
8489 0