版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010046908/article/details/54930240
今天来总结一下。Spring中quartz的使用。
1、Quartz是什么?
Quartz 是一个开源的作业调度框架,它完全由 Java 写成,并设计用于 J2SE 和 J2EE 应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。
2、Quartz的分类
2.1、按照作业类的继承方式来分,可以分为两类
- 作业类需要继承自特定的作业类基类,如Quartz中需要继承自org.springframework.scheduling.quartz.QuartzJobBean;java.util.Timer中需要继承自java.util.TimerTask。
- 作业类即普通的java类,不需要继承自任何基类。
注意:推荐使用第二种方式,因为这样所以的类都是普通类,不需要事先区别对待。
2.2、按照任务调度的触发时机来分,这里主要是针对作业使用的触发器,主要有以下两种:
每隔指定时间则触发一次,在Quartz中对应的触发器为:org.springframework.scheduling.quartz.SimpleTriggerBean
每到指定时间则触发一次,在Quartz中对应的调度器为:org.springframework.scheduling.quartz.CronTriggerBean
注意:并非每种任务都可以使用这两种触发器,如java.util.TimerTask任务就只能使用第一种。Quartz和spring task都可以支持这两种触发条件。
3、添加Quartz依赖
1
2
3
4
5
6
7 1<!-- 定时器的使用 -->
2 <dependency>
3 <groupId>org.quartz-scheduler</groupId>
4 <artifactId>quartz</artifactId>
5 <version>2.2.3</version>
6 </dependency>
7
4、Spring中quartz的使用(作业类即普通的java类的使用)
4.1、定义作业类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 1package com.lidong.dubbo.core.util.quartz;
2
3import java.text.SimpleDateFormat;
4import java.util.Date;
5
6import org.slf4j.Logger;
7import org.slf4j.LoggerFactory;
8
9/**
10 * @项目名称:lidong-dubbo
11 * @类名:SpringQtz
12 * @类的描述: 作业类的调度
13 * @作者:lidong
14 * @创建时间:2017/2/8 下午5:41
15 * @公司:chni
16 * @QQ:1561281670
17 * @邮箱:lidong1665@163.com
18 */
19public class SpringQtz {
20
21 static Logger logger = LoggerFactory.getLogger(SpringQtz.class);
22 private static int counter = 0;
23
24 /**
25 * 调度的方法
26 */
27 public void execute() {
28 long ms = System.currentTimeMillis();
29 logger.info(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date(ms))+" "+"(" + counter++ + ")");
30 }
31}
32
4.2、在Spring中配置作业类
1
2
3
4 1<!-- 要调用的工作类 -->
2 <bean id="SpringQtzJob" class="com.lidong.dubbo.core.util.quartz.SpringQtz" />
3
4
4.3 、定义调用对象和方法
1
2
3
4
5
6
7
8
9
10
11
12
13 1<!-- 定义调用对象和调用对象的方法 -->
2 <bean id="SpringQtzJobMethod"
3 class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
4 <!-- 调用的类 -->
5 <property name="targetObject">
6 <ref bean="SpringQtzJob" />
7 </property>
8 <!-- 要执行的方法名称 -->
9 <property name="targetMethod">
10 <value>execute</value>
11 </property>
12 </bean>
13
4.4、配置调度触发器
1
2
3
4
5
6
7
8
9 1<!-- ======================== 调度触发器 ======================== -->
2 <bean id="CronTriggerBean"
3 class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
4 <!--作业详情 -->
5 <property name="jobDetail" ref="SpringQtzJobMethod"></property>
6 <!-- cron表达式 -->
7 <property name="cronExpression" value="0/10 * * * * ?"></property>
8 </bean>
9
4.5、配置调度工厂
1
2
3
4
5
6
7
8
9
10
11
12 1<!-- ======================== 调度工厂 ======================== -->
2 <bean id="SpringJobSchedulerFactoryBean"
3 class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
4 <property name="triggers">
5 <list>
6 <ref bean="CronTriggerBean" />
7 <ref bean="CronTriggerBean1" />
8 </list>
9 </property>
10 </bean>
11
12
5、quartz的cron 表达式
一个cron表达式至少有6个,是按照空格来分割的时间元素。
按照顺序为:
- 秒 0-59
- 分钟 0-59
- 小时 0-23
- 天 (月)1-31
- 月 0-31
- 天 (星期)1-7
年份 1970- 递增
给几个例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 1
2"30 * * * * ?" 每半分钟触发任务
3"30 10 * * * ?" 每小时的10分30秒触发任务
4"30 10 1 * * ?" 每天1点10分30秒触发任务
5"30 10 1 20 * ?" 每月20号1点10分30秒触发任务
6"30 10 1 20 10 ? *" 每年10月20号1点10分30秒触发任务
7"30 10 1 20 10 ? 2011" 2011年10月20号1点10分30秒触发任务
8"30 10 1 ? 10 * 2011" 2011年10月每天1点10分30秒触发任务
9"30 10 1 ? 10 SUN 2011" 2011年10月每周日1点10分30秒触发任务
10"15,30,45 * * * * ?" 每15秒,30秒,45秒时触发任务
11"15-45 * * * * ?" 15到45秒内,每秒都触发任务
12"15/5 * * * * ?" 每分钟的每15秒开始触发,每隔5秒触发一次
13"15-30/5 * * * * ?" 每分钟的15秒到30秒之间开始触发,每隔5秒触发一次
14"0 0/3 * * * ?" 每小时的第0分0秒开始,每三分钟触发一次
15"0 15 10 ? * MON-FRI" 星期一到星期五的10点15分0秒触发任务
16"0 15 10 L * ?" 每个月最后一天的10点15分0秒触发任务
17"0 15 10 LW * ?" 每个月最后一个工作日的10点15分0秒触发任务
18"0 15 10 ? * 5L" 每个月最后一个星期四的10点15分0秒触发任务
19"0 15 10 ? * 5#3" 每个月第三周的星期四的10点15分0秒触发任务
20
21
基本上就这么多了。
代码地址: