在java開發(fā)中定時(shí)任務(wù)的實(shí)現(xiàn)有多種方式嗅榕,jdk有自己的定時(shí)任務(wù)實(shí)現(xiàn)方式充坑,很多框架也有定時(shí)任務(wù)的實(shí)現(xiàn)方式拆融。這里,我介紹一種很簡(jiǎn)單的實(shí)現(xiàn)方式唁情,在Spring Boot項(xiàng)目中使用兩個(gè)注解即可實(shí)現(xiàn)疑苔。
在spring boot的啟動(dòng)類上面添加 @EnableScheduling 注解
新創(chuàng)建一個(gè)類,用來實(shí)現(xiàn)定時(shí)任務(wù)甸鸟,這個(gè)類要注冊(cè)為Bean才行惦费,所以要加上 @Component 、@Repository 哀墓、 @ Controller 趁餐、@Service 喷兼、@Configration其中的一個(gè)注解篮绰。然后再里面的方法中加上 @Scheduled 注解。
然后為Scheduled注解加上屬性季惯,啟動(dòng)項(xiàng)目吠各,就可以了。下面介紹Scheduled屬性的用法勉抓。
fixedRate
fixedRate表示上一個(gè)執(zhí)行開始后再一次執(zhí)行的時(shí)間贾漏,但是必須要等上一次執(zhí)行完成后才能執(zhí)行。如果上一次執(zhí)行完成了藕筋,還沒到下一次執(zhí)行的時(shí)間 纵散,就會(huì)等到下一次執(zhí)行的時(shí)間到了才會(huì)執(zhí)行,如果下一次的執(zhí)行時(shí)間到了隐圾,上一次還沒執(zhí)行完伍掀,那么就會(huì)等到 上一次執(zhí)行完成才會(huì)執(zhí)行下一次。=后面的值 1000 為1秒暇藏。
@Scheduled(fixedRate = 1000)
public void fixedRate() throws Exception {
System.out.println("fixedRate開始執(zhí)行時(shí)間:" + new Date(System.currentTimeMillis()));
//休眠8秒
Thread.sleep(1000 * 8);
System.out.println("fixedRate執(zhí)行結(jié)束時(shí)間:" + new Date(System.currentTimeMillis()));
}
我們啟動(dòng)項(xiàng)目看看這個(gè)定時(shí)任務(wù)的執(zhí)行情況蜜笤,可以看到開始和結(jié)束時(shí)間之間間隔了8秒,然后馬上執(zhí)行了下一次盐碱。
我們把改成每2秒執(zhí)行一次把兔,休眠一秒沪伙,再來看看效果,可以看到開始執(zhí)行的時(shí)間間隔了2秒县好。
@Scheduled(fixedRate = 1000 * 2)
public void fixedRate() throws Exception {
System.out.println("fixedRate開始執(zhí)行時(shí)間:" + new Date(System.currentTimeMillis()));
//休眠8秒
Thread.sleep(1000);
System.out.println("fixedRate執(zhí)行結(jié)束時(shí)間:" + new Date(System.currentTimeMillis()));
}
fixedDelay
fixedDelay表示上一次執(zhí)行結(jié)束后再一次執(zhí)行的時(shí)間围橡,啟動(dòng)項(xiàng)目,可以看到上一次執(zhí)行結(jié)束后還等了1秒才執(zhí)行下一次缕贡。
@Scheduled(fixedDelay = 1000)
public void fixedDelay() throws Exception {
System.out.println("fixedDelay開始執(zhí)行時(shí)間:" + new Date(System.currentTimeMillis()));
//休眠兩秒
Thread.sleep(1000 * 2);
System.out.println("fixedDelay執(zhí)行結(jié)束時(shí)間:" + new Date(System.currentTimeMillis()));
}
initialDelay
initialDelay表示項(xiàng)目啟動(dòng)后延遲多久執(zhí)行定時(shí)任務(wù)某饰,所以他要配合fixedRate或fixedDelay一起使用。
@Scheduled(initialDelay = 1000*3, fixedDelay = 1000)
public void initialDelay() throws Exception {
System.out.println("initialDelay開始執(zhí)行時(shí)間:" + new Date(System.currentTimeMillis()));
}
啟動(dòng)項(xiàng)目善绎,可以看到項(xiàng)目啟動(dòng)完成后黔漂,等了3秒才開始執(zhí)行的定時(shí)任務(wù)。
ceon
cron是一種表達(dá)式禀酱,具體的寫法規(guī)格有興趣的可以去學(xué)習(xí)一下炬守,不懂也不影響使用,直接按照示例就可以類推剂跟,寫出自己想要的减途,也可以直接使用在線生成。
下面寫幾個(gè)示例:
*/3 * * * * ? 每隔3秒執(zhí)行一次
0 */1 * * * ? 每隔1分鐘執(zhí)行一次
0 0 3-10 * * ? 每天3-10點(diǎn)整點(diǎn)觸發(fā)
0 0/3 * * * ? 每三分鐘觸發(fā)一次
0 0-3 14 * * ? 在每天下午2點(diǎn)到下午2:03期間的每1分鐘觸發(fā)
0 0/5 14 * * ? 在每天下午2點(diǎn)到下午2:55期間的每5分鐘觸發(fā)
0 0 10,14,17 * * ? 每天上午10點(diǎn)曹洽,下午2點(diǎn)鳍置,5點(diǎn)
cron大致了解后,來看看實(shí)現(xiàn)效果送淆,我寫的是每 3秒執(zhí)行一次
@Scheduled(cron = "*/3 * * * * ?")
public void cron() {
System.out.println("cron開始執(zhí)行時(shí)間:" + new Date(System.currentTimeMillis()));
}
啟動(dòng)項(xiàng)目后税产,可以看到每次的執(zhí)行時(shí)間間隔了3秒
spring boot 用@Scheduled注解實(shí)現(xiàn)定時(shí)任務(wù)就介紹到這里。