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