我們先看下本節(jié)的大綱:
(1)定時(shí)任務(wù)的幾種實(shí)現(xiàn)方式;
(2)Spring Task入門;
(3)cronExpression配置說明;
(4)cronExpression實(shí)例;
接下來我們看看具體的每個(gè)步驟:
(1)定時(shí)任務(wù)的幾種實(shí)現(xiàn)方式;
Timer :Java自帶的java.util.Timer類,這個(gè)類允許你調(diào)度一個(gè)java.util.TimerTask任務(wù)。使用這種方式可以讓你的程序按照某一個(gè)頻度執(zhí)行,但不能在指定時(shí)間運(yùn)行。一般用的較少。
Quartz :使用Quartz,這是一個(gè)功能比較強(qiáng)大的的調(diào)度器,可以讓你的程序在指定時(shí)間執(zhí)行,也可以按照某一個(gè)頻度執(zhí)行,配置起來稍顯復(fù)雜。
SpringTask :Spring3.0以后自帶的task,可以將它看成一個(gè)輕量級(jí)的Quartz,而且使用起來比Quartz簡(jiǎn)單許多。
(2)SpringTask入門;
再次我們編寫一個(gè)簡(jiǎn)單的例子學(xué)習(xí)下定時(shí)器的簡(jiǎn)單應(yīng)用:
(a)新建一個(gè)spring-boot-task工程;
這個(gè)步驟很簡(jiǎn)單,不多說。
(b)在pom.xml文件添加依賴,如下:
"http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd" >
4.0.0
com.kfit
spring-boot-task2
0.0.1-SNAPSHOT
jar
spring-boot-task2
http://maven.apache.org
<project.build.sourceEncoding>UTF-8class="hljs-name"project.build.sourceEncoding>
1.8class="hljs-name"java.version>
<parent>
<groupId>org.springframework.boot<span class="hljs-name"groupId>
<artifactId>spring-boot-starter-parent<span class="hljs-name"artifactId>
<version>1.4.1.RELEASE<span class="hljs-name"version>
<span class="hljs-name"parent>
<dependency>
<groupId>junit<span class="hljs-name"groupId>
<artifactId>junit<span class="hljs-name"artifactId>
<scope>test<span class="hljs-name"scope>
<span class="hljs-name"dependency>
<dependency>
<groupId>org.springframework.boot<span class="hljs-name"groupId>
<artifactId>spring-boot-starter-web<span class="hljs-name"artifactId>
<span class="hljs-name"dependency>
(c)編寫啟動(dòng)類,App.java:
package com.kfit;
import org.springframework.boot.SpringApplication;
**import **org.springframework.boot.autoconfigure.SpringBootApplication;
/**
- @author Angel --守護(hù)天使
- @version v.0.1
- @date 2017年3月26日
*/
@SpringBootApplication
**public **class App {
**public ****static ****void** main(String[] args) {
SpringApplication. *run* (App. **class** , args);
}
}
(c)編寫定時(shí)任務(wù)調(diào)度類,MyTask.java:
package com.kfit.task;
import java.util.Date;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
/**
- @author Angel --守護(hù)天使
- @version v.0.1
- @date 2017年3月26日
*/
@Configuration
@EnableScheduling
**public **class MyTask {
/**
* 我們希望這個(gè)方法每10秒打印一次.
* cron:定時(shí)任務(wù)表達(dá)式.
*
* 指定:秒,分鐘,小時(shí),日期,月份,星期,年(可選).
* *:任意.
*
*/
@Scheduled(cron="0/10 * ** * *")
//@Scheduled(cron="0/10* * * * ?")
**public ****void** tast1(){
System. ***out*** .println("MyTask.tast1(),"+**new** Date());
}
/**
* 我們希望這個(gè)方法每1分鐘打印一次.
*/
@Scheduled(cron="0 0/1 * ** *")
**public ****void** tast2(){
System. ***out*** .println("MyTask.tast2(),"+**new** Date());
}
}
在這里有有一個(gè)地方需要特別說明下:
MyTask.tast1()
MyTask.tast1()
MyTask.tast1()
MyTask.tast2()
MyTask.tast1()
tast1: 每10秒打印1次.
task2: 每1分鐘打印1次.
1分鐘是60秒 = 沒打印6次task1之后才能夠打印1次task2.
spring task 在計(jì)算時(shí)間的時(shí)候,是根據(jù)當(dāng)前服務(wù)器的系統(tǒng)時(shí)間進(jìn)行計(jì)算.
如果是每10秒執(zhí)行一次的話,那么它是從系統(tǒng)時(shí)間的0,10,20秒進(jìn)行計(jì)算的.
如果是每1分鐘執(zhí)行一次的話,那么它是從系統(tǒng)時(shí)間的1分鐘,2分鐘進(jìn)行計(jì)算的。
如果是這樣的話,那么我會(huì)碰到這樣的情況:就是當(dāng)我們剛剛啟動(dòng)程序的時(shí)候,我們的時(shí)間
剛好是9:39:55秒,那么就會(huì)出現(xiàn)5秒之后會(huì)執(zhí)行1次task1和1次task2.
(d)啟動(dòng)運(yùn)行程序進(jìn)行測(cè)試:
這個(gè)大家運(yùn)行完之后關(guān)注下控制臺(tái)的打印信息。
(3)cronExpression配置說明;
字段 | 允許值 | 允許的特殊字符 |
---|---|---|
秒 | 0-59 | , - * / |
分 | 0-59 | , - * / |
小時(shí) | 0-23 | , - * / |
日期 | 1-31 | , - * ? / LWC |
月份 | 1-12 或者 JAN-DEC | , - * / |
星期 | 1-7 或者 SUN-SAT | , - * ? / LC # |
年(可選) | 留空, 1970-2099 | , - * / |
特殊字符:
在Cron表達(dá)式的時(shí)間字段中,除允許設(shè)置數(shù)值外,還能你使用一些特殊的字符,提供列表、范圍、通配符等功能
星號(hào)(*)
可用在所有字段下,表示對(duì)應(yīng)時(shí)間域名的每一個(gè)時(shí)刻,如*用在分鐘字段,表示“每分鐘”。
問號(hào)(?)
只能用在日期和星期字段,代表無意義的值,比如使用L設(shè)定為當(dāng)月的最后一天,則配置日期配置就沒有意義了,可用?作占位符的作用。
減號(hào)(-)
表示一個(gè)范圍,如在日期字段5-10,表示從五號(hào)到10號(hào),相當(dāng)于使用逗號(hào)的5,6,7,8,9,10
逗號(hào)(,)
表示一個(gè)并列有效值,比如在月份字段使用JAN,DEC表示1月和12月
斜杠(/)
x/y表示一個(gè)等步長(zhǎng)序列,x為起始值,y為增量步長(zhǎng)值,如在小時(shí)使用1/3相當(dāng)于1,4,7,10當(dāng)時(shí)用*/y時(shí),相當(dāng)于0/y
L
L(Last)只能在日期和星期字段使用,但意思不同。在日期字段,表示當(dāng)月最后一天,在星期字段,表示星期六(如果按星期天為一星期的第一天的概念,星期六就是最后一天。如果L在星期字段,且前面有一個(gè)整數(shù)值X,表示“這個(gè)月的最后一個(gè)星期X”,比如3L表示某個(gè)月的最后一個(gè)星期二。
W
選擇離給定日期最近的工作日(周一至周五)。例如你指定“15W”作為day of month字段的值,就意味著“每個(gè)月與15號(hào)最近的工作日”。所以,如果15號(hào)是周六,則觸發(fā)器會(huì)在14號(hào)(周五)觸發(fā)。如果15號(hào)是周日,則觸發(fā)器會(huì)在16號(hào)(周一)觸發(fā)。如果15號(hào)是周二,則觸發(fā)器會(huì)在15號(hào)(周二)觸發(fā)。但是,如果你指定“1W”作為day of month字段的值,且1號(hào)是周六,則觸發(fā)器會(huì)在3號(hào)(周一)觸發(fā)。quartz不會(huì)“跳出”月份的界限。
LW****組合
在日期字段可以組合使用LW,表示當(dāng)月最后一個(gè)工作日(周一至周五)
井號(hào)(#)
只能在星期字段中使用指定每月第幾個(gè)星期X。例如day of week字段的“6#3”,就意味著“每月第3個(gè)星期五”(day3=星期五,#3=第三個(gè));“2#1”就意味著“每月第1個(gè)星期一”;“4#5”就意味著“每月第5個(gè)星期3。需要注意的是“#5”,如果在當(dāng)月沒有第5個(gè)星期三,則觸發(fā)器不會(huì)觸發(fā)。
C
只能在日期和星期字段中使用,表示計(jì)劃所關(guān)聯(lián)的誒其,如果日期沒有被關(guān)聯(lián),相當(dāng)于日歷中的所有日期,如5C在日期字段相當(dāng)于5號(hào)之后的第一天,1C在日期字段使用相當(dāng)于星期填后的第一天
(4)cronExpression實(shí)例;
CRON表達(dá)式 含義
"0 0 12 * * ?" 每天中午十二點(diǎn)觸發(fā)
"0 15 10 ? * *" 每天早上10:15觸發(fā)
"0 15 10 * * ?" 每天早上10:15觸發(fā)
"0 15 10 * * ? *" 每天早上10:15觸發(fā)
"0 15 10 * * ?2005" 2005年的每天早上10:15觸發(fā)
“0 * 14 * * ?" 每天從下午2點(diǎn)開始到2點(diǎn)59分每分鐘一次觸發(fā)
"0 0/5 14 * * ?" 每天從下午2點(diǎn)開始到2:55分結(jié)束每5分鐘一次觸發(fā)
"0 0/5 14,18 * *?" 每天的下午2點(diǎn)至2:55和6點(diǎn)至6點(diǎn)55分兩個(gè)時(shí)間段內(nèi)每5分鐘一次觸發(fā)
"0 0-5 14 * * ?" 每天14:00至14:05每分鐘一次觸發(fā)
"0 10,44 14 ? 3WED" 三月的每周三的14:10和14:44觸發(fā)
"0 15 10 ? *MON-FRI" 每個(gè)周一、周二、周三、周四、周五的10:15觸發(fā)
-
JAVA
+關(guān)注
關(guān)注
19文章
2958瀏覽量
104544 -
XML
+關(guān)注
關(guān)注
0文章
188瀏覽量
33041 -
spring
+關(guān)注
關(guān)注
0文章
338瀏覽量
14309
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論