简介
quarzt是一个项目中定时执行任务的开源项目,quartz是opensymphony开源组织在job scheduling领域又一个开源项目,它可以与j2ee与j2se应用程序相结合也可以单独使用,这里我们介绍和spring整合的例子
因为spring已经整合quarzt,所以我们只需要配置一下即可。
下载jar包
1.可以直接去http://www.quartz-scheduler.org/ quarzt的官方网站下载jar包
2.可以通过maven来构建,记得引入spring所需要的jar
1
2
3
4
5
6
7
8
9
10
11
|
<!-- 引入quartz对应的依赖 -->
<dependency>
<groupid>org.quartz-scheduler</groupid>
<artifactid>quartz</artifactid>
<version> 2.2 . 3 </version>
</dependency>
<dependency>
<groupid>org.quartz-scheduler</groupid>
<artifactid>quartz-jobs</artifactid>
<version> 2.2 . 3 </version>
</dependency>
|
概念
任务类:即需要定时执行代码的类。
jobdetail:配置任务类的细节,即注入任务类和指定任务类的方法,是一个可执行的工作,它本身可能是有状态的。
触发器(mytrigger):触发器代表一个调度参数的配置,配置调用的时间。
调度工厂(scheduler):是一个计划调度器容器,容器里面可以盛放众多的jobdetail和trigger,当容器启动后,里面的每个jobdetail都会根据trigger按部就班自动去执行。
配置方法
•首先编写任务类
1
2
3
4
5
|
public class myjob {
public void job() {
system.out.println( new simpledateformat( "yyyy-mm-dd hh:mm:ss" ).format( new date()) + ": 任务执行" );
}
}
|
•然后再spring配置任务类的bean
1
|
<bean id= "myjob" class = "quarzt.test.myjob" / >
|
•配置jobdetail,注入任务类和任务类的方法
1
2
3
4
5
6
|
<bean id= "jobdetail" class = "org.springframework.scheduling.quartz.methodinvokingjobdetailfactorybean" >
<!-- 注入目标对象 -->
<property name= "targetobject" ref= "myjob" />
<!-- 注入目标方法 -->
<property name= "targetmethod" value= "job" />
</bean>
|
•配置触发器
1
2
3
4
5
6
7
8
9
|
<!-- 配置触发器 -->
<bean id= "mytrigger" class = "org.springframework.scheduling.quartz.crontriggerfactorybean" >
<!-- 注入任务详情对象 -->
<property name= "jobdetail" ref= "jobdetail" />
<!-- 注入cron表达式,通过这个表达式指定触发的时间点 -->
<property name= "cronexpression" >
<value>/ 5 * * * * ?</value> // 表示每隔五秒执行一次。 corn在下面会有活命
</property>
</bean>
|
•最后配置调度工厂并且注入配置好的触发器
1
2
3
4
5
6
7
8
9
|
<!-- 配置调度工厂 -->
<bean id= "schedulerfactorybean" class = "org.springframework.scheduling.quartz.schedulerfactorybean" >
<!-- 注入触发器 -->
<property name= "triggers" >
<list>
<ref bean= "mytrigger" />
</list>
</property>
</bean>
|
到此就配置完成,可以执行定时任务了。
执行结果
cron表达式
corn用来控制任务的调度时间,在trigger中配置,下面是corn表达式的基本语法,如果看着太复杂,网上提供了corn语法生成器 http://cron.qqe2.com/ 可以通过指定条件自动生成corn表达式。
下面是七个*所代表的意义
星号:* 代表任意时间,即指示着你想在这个域上包含所有合法的值,
* * * * * *
代表每时每刻都会触发
0 * 17 * * ?
: 每天从下午5点到下午5:59中的每分钟激发一次 trigger。它停在下午 5:59 是因为值 17 在小时域上,在下午 6 点时,小时变为 18 了,也就不再理会这个 trigger,直到下一天的下午5点。
问号(?):? 号只能用在日和周域上,但是不能在这两个域上同时使用。你可以认为 ? 字符是 "我并不关心在该域上是什么值。" 这不同于星号,星号是指示着该域上的每一个值。? 是说不为该域指定值,假如你为这两域的其中一个指定了值,那就必须在另一个字值上放一个 ?。
0 10,44 14 ? 3 web
:在三月中的每个星期三的下午 2:10 和 下午 2:44 被触发。
逗号(,) : 是用来在给某个域上指定一个值列表的。例如,使用值 0,15,30,45 在秒域上意味着每15秒触发一个 trigger。
0 0,15,30,45 * * * ?
:每刻钟触发一次 trigger。
反斜线(/): (/) 是用于时间表的递增的。我们刚刚用了逗号来表示每15分钟的递增,但是我们也能写成这样 0/15。
0/15 0/30 * * * ?
:在整点和半点时每15秒触发 trigger。
中划线(-):中划线 (-) 用于指定一个范围。例如,在小时域上的 3-8 意味着 "3,4,5,6,7 和 8 点。" 域的值不允许回卷,所以像 50-10 这样的值是不允许的。
0 45 3-8 ? * *
::在上午的3点至上午的8点的45分时触发。
字母(l):l 说明了某域上允许的最后一个值。它仅被日和周域支持。当用在日域上,表示的是在月域上指定的月份的最后一天,当 l 字母用于周域上,指示着周的最后一天,就是星期六 (或者数字7),你可以用一个数字与 l 连起来表示月份的最后一个星期 x。
0 0 8 l * ?
:每个月最后一天的上午 8:00 触发
0 59 23 ? * l
:每个月的最后一个星期六下午的 11:59 触发
0 0 12 ? * 2l
:每个月的最后一个星期一触发(数字与 l 连起来表示月份的最后一个星期 x)
字母(w):平日 (mon-fri),并且仅能用于日域中。它用来指定离指定日的最近的一个平日
井号(#):# 字符仅能用于周域中。它用于指定月份中的第几周的哪一天。例如,如果你指定周域的值为 6#3,它意思是某月的第三个周五 (6=星期五,#3意味着月份中的第三周)。
示例
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
|
"0 0 12 * *?" 每天中午 12 点触发
"0 15 10 ? **" 每天上午 10 : 15 触发
"0 15 10 * *?" 每天上午 10 : 15 触发
"0 15 10 * * ?*" 每天上午 10 : 15 触发
"0 15 10 * * ?2005" 2005 年的每天上午 10 : 15 触发
"0 * 14 * *?" 在每天下午 2 点到下午 2 : 59 期间的每 1 分钟触发
"0 0/5 14 * *?" 在每天下午 2 点到下午 2 : 55 期间的每 5 分钟触发
"0 0/5 14,18 ** ?" 在每天下午 2 点到 2 : 55 期间和下午 6 点到 6 : 55 期间的每 5 分钟触发
"0 0-5 14 * *?" 在每天下午 2 点到下午 2 : 05 期间的每 1 分钟触发
"0 10,44 14 ? 3wed" 每年三月的星期三的下午 2 : 10 和 2 : 44 触发
"0 15 10 ? *mon-fri" 周一至周五的上午 10 : 15 触发
"0 15 10 15 *?" 每月 15 日上午 10 : 15 触发
"0 15 10 l *?" 每月最后一日的上午 10 : 15 触发
"0 15 10 ? *6l" 每月的最后一个星期五上午 10 : 15 触发
"0 15 10 ? * 6l2002-2005" 2002 年至 2005 年的每月的最后一个星期五上午 10 : 15 触发
"0 15 10 ? *6#3" 每月的第三个星期五上午 10 : 15 触发
|
以上这篇基于quartz定时调度任务(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:http://www.cnblogs.com/liyuhui-Z/archive/2017/11/07/7795153.html