這里介紹最簡單的Spring Boot定時任務(wù)入門
- 新建一個Spring Boot項目,我們在Spring Boot的入口類Application.java中馒吴,允許支持schedule
package com.example.timing;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling
public class TimingApplication {
public static void main(String[] args) {
SpringApplication.run(TimingApplication.class, args);
}
}
- 新建一個執(zhí)行類
package com.example.timing.service;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
@Component
public class TimeService {
/**
* 通過時間表達式執(zhí)行定時任務(wù)
*/
@Scheduled(cron = "0/5 * * * * ?")
public void timerToNow(){
System.out.println("now time:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
}
/**
*啟動時間點之后 X毫秒秒執(zhí)行一次
*/
@Scheduled(fixedRate = 10000)
public void timerToZZP(){
System.out.println("fixedRate:" + new Random().nextLong() + new SimpleDateFormat("HH:mm:ss").format(new Date()));
}
/**
* 結(jié)束時間點之后 每X毫秒執(zhí)行一次
*/
@Scheduled(fixedDelay = 10000)
public void timerToReportCount(){
System.out.println("fixedDelay:" + new Random().nextLong() + new SimpleDateFormat("HH:mm:ss").format(new Date()));
}
/**
* 第一次延遲 X毫秒執(zhí)行,之后按照fixedRate的規(guī)則每X毫秒執(zhí)行
*/
@Scheduled(initialDelay = 1000,fixedRate = 6000)
public void timerToReport(){
System.out.println("initialDelay:" + new Random().nextLong() + new SimpleDateFormat("HH:mm:ss").format(new Date()));
}
}
-
輸出結(jié)果
輸出結(jié)果.png
注釋
①corn:通過時間表達式執(zhí)行定時任務(wù)
②fixedRate:啟動時間點之后 X毫秒秒執(zhí)行一次
③fixedDelay:結(jié)束時間點之后 每X毫秒執(zhí)行一次
④initialDelay:第一次延遲 X毫秒執(zhí)行饮戳,之后按照fixedRate的規(guī)則每X毫秒執(zhí)行
corn用法
cron表達式,有專門的語法扯罐,而且感覺有點繞人负拟,不過簡單來說歹河,大家記住一些常用的用法即可掩浙,特殊的語法可以單獨去查启泣。
cron一共有7位涣脚,但是最后一位是年寥茫,可以留空,所以我們可以寫6位:
* 第一位矾麻,表示秒纱耻,取值0-59
* 第二位,表示分险耀,取值0-59
* 第三位,表示小時甩牺,取值0-23
* 第四位蘑志,日期天/日贬派,取值1-31
* 第五位急但,日期月份搞乏,取值1-12
* 第六位波桩,星期请敦,取值1-7镐躲,星期一,星期二...萤皂,注:不是第1周撒穷,第二周的意思
另外:1表示星期天裆熙,2表示星期一桥滨。
* 第7為弛车,年份齐媒,可以留空纷跛,取值1970-2099
cron中喻括,還有一些特殊的符號贫奠,含義如下:
(*)星號:可以理解為每的意思唬血,每秒,每分拷恨,每天,每月谢肾,每年...
(?)問號:問號只能出現(xiàn)在日期和星期這兩個位置,表示這個位置的值不確定芦疏,每天3點執(zhí)行,所以第六位星期的位置酸茴,我們是不需要關(guān)注的分预,就是不確定的值薪捍。同時:日期和星期是兩個相互排斥的元素笼痹,通過問號來表明不指定值酪穿。比如凳干,1月10日昆稿,比如是星期1纺座,如果在星期的位置是另指定星期二溉潭,就前后沖突矛盾了净响。
(-)減號:表達一個范圍,如在小時字段中使用“10-12”馋贤,則表示從10到12點赞别,即10,11,12
(,)逗號:表達一個列表值配乓,如在星期字段中使用“1,2,4”仿滔,則表示星期一犹芹,星期二崎页,星期四
(/)斜杠:如:x/y腰埂,x是開始值飒焦,y是步長屿笼,比如在第一位(秒) 0/15就是牺荠,從0秒開始驴一,每15秒休雌,最后就是0肝断,15杈曲,30孝情,45鱼蝉,60 另:*/y箫荡,等同于0/y
下面列舉幾個例子:
0 0 3 * * ? 每天3點執(zhí)行
0 5 3 * * ? 每天3點5分執(zhí)行
0 5 3 ? * * 每天3點5分執(zhí)行,與上面作用相同
0 5/10 3 * * ? 每天3點的 5分渔隶,15分,25分间唉,35分,45分呈野,55分這幾個時間點執(zhí)行
0 10 3 ? * 1 每周星期天低矮,3點10分 執(zhí)行被冒,注:1表示星期天
0 10 3 ? * 1#3 每個月的第三個星期军掂,星期天 執(zhí)行,#號只能出現(xiàn)在星期的位置