定時(shí)任務(wù)一般會(huì)存在中大型企業(yè)級(jí)項(xiàng)目中盒让,為了減少服務(wù)器愈犹、數(shù)據(jù)庫的壓力往往會(huì)采用時(shí)間段性的去完成某些業(yè)務(wù)邏輯媳叨。比較常見的就是金融服務(wù)系統(tǒng)推送回調(diào)划提,一般支付系統(tǒng)訂單在沒有收到成功的回調(diào)返回內(nèi)容時(shí)會(huì)持續(xù)性的回調(diào)万牺,這種回調(diào)一般都是定時(shí)任務(wù)來完成的罗珍。還有就是報(bào)表的生成,我們一般會(huì)在客戶訪問量過小的時(shí)候來完成這個(gè)操作脚粟,那往往都是在凌晨覆旱。這時(shí)我們也可以采用定時(shí)任務(wù)來完成邏輯。SpringBoot為我們內(nèi)置了定時(shí)任務(wù)珊楼,我們只需要一個(gè)注解就可以開啟定時(shí)為我們所用了通殃。
免費(fèi)專題文章匯總
恒宇少年在博客整理出來了SpringBoot、ApiBoot厕宗、SpringCloud的文章匯總【SpringBoot基礎(chǔ)教程專題】画舌,【SpringCloud基礎(chǔ)教程專題】,【ApiBoot組件使用專題】
本章目標(biāo)
基于SpringBoot架構(gòu)完成注解@Scheduled的定時(shí)任務(wù)配置已慢。
構(gòu)建項(xiàng)目
使用idea開發(fā)工具來構(gòu)建SpringBoot項(xiàng)目曲聂,我們預(yù)先導(dǎo)入Web依賴,pom.xml如下圖1所示:
文章開頭我說到了SpringBoot為我們內(nèi)置了@Scheduled定時(shí)任務(wù)佑惠,下面我們就來配置下這個(gè)注解朋腋,找到入口程序Chapter26Application添加注解@EnableScheduling,如下圖2所示:
可以看到上圖2內(nèi)我們添加注解后SpringBoot就已經(jīng)認(rèn)定了我們要使用定時(shí)任務(wù)來完成一些業(yè)務(wù)邏輯了膜楷,內(nèi)部會(huì)對(duì)應(yīng)原始配置定時(shí)任務(wù)添加對(duì)應(yīng)的配置文件旭咽。
@Scheduled
@scheduled注解用來配置到方法上來完成對(duì)應(yīng)的定時(shí)任務(wù)的配置,如執(zhí)行時(shí)間赌厅,間隔時(shí)間穷绵,延遲時(shí)間等等,下面我們就來詳細(xì)的看下對(duì)應(yīng)的屬性配置特愿。
我們先來創(chuàng)建一個(gè)測試的定時(shí)任務(wù)實(shí)體仲墨,如下圖3所示:
上圖3內(nèi)的注解@Compoment用來標(biāo)明這是一個(gè)被Spring管理的Bean,這個(gè)就不用多做講解了。下面我們來配置@Scheduled揍障,來完成每小時(shí)的整10分鐘輸出內(nèi)容目养,如下圖4所示:
cron屬性
這是一個(gè)時(shí)間表達(dá)式,可以通過簡單的配置就能完成各種時(shí)間的配置毒嫡,我們通過CRON表達(dá)式幾乎可以完成任意的時(shí)間搭配癌蚁,它包含了六或七個(gè)域:
Seconds?: 可出現(xiàn)", - * /"四個(gè)字符,有效范圍為0-59的整數(shù)
Minutes?: 可出現(xiàn)", - * /"四個(gè)字符,有效范圍為0-59的整數(shù)
Hours?: 可出現(xiàn)", - * /"四個(gè)字符匈勋,有效范圍為0-23的整數(shù)
DayofMonth?: 可出現(xiàn)", - * / ? L W C"八個(gè)字符礼旅,有效范圍為0-31的整數(shù)
Month?: 可出現(xiàn)", - * /"四個(gè)字符,有效范圍為1-12的整數(shù)或JAN-DEc
DayofWeek?: 可出現(xiàn)", - * / ? L C #"四個(gè)字符洽洁,有效范圍為1-7的整數(shù)或SUN-SAT兩個(gè)范圍痘系。1表示星期天,2表示星期一饿自, 依次類推
Year?: 可出現(xiàn)", - * /"四個(gè)字符汰翠,有效范圍為1970-2099年
下面簡單舉幾個(gè)例子:
"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 ? 3 WED" ? ?三月的每周三的14:10和14:44觸發(fā)
"0 15 10 ? * MON-FRI" ? ?每個(gè)周一、周二昭雌、周三复唤、周四、周五的10:15觸發(fā)
fixedRate屬性
該屬性的含義是上一個(gè)調(diào)用開始后再次調(diào)用的延時(shí)(不用等待上一次調(diào)用完成)烛卧,這樣就會(huì)存在重復(fù)執(zhí)行的問題佛纫,所以不是建議使用,但數(shù)據(jù)量如果不大時(shí)在配置的間隔時(shí)間內(nèi)可以執(zhí)行完也是可以使用的总放。配置示例如下圖5所示:
可以看到上圖5內(nèi)我配置的間隔時(shí)間是1秒呈宇,我在方法內(nèi)使用了線程休眠,我們來測試下間隔輸出的時(shí)間是多少局雄,下面我們來啟動(dòng)項(xiàng)目甥啄,并且查看控制臺(tái)輸出內(nèi)容。
項(xiàng)目成功啟動(dòng)后查看控制臺(tái)內(nèi)容如下圖6所示:
我們可以看到每一次打印的間隔都是2秒鐘炬搭,也就是我們配置線程休眠的時(shí)間蜈漓,很好的證實(shí)了該方法并沒有等到執(zhí)行完再開始下一次執(zhí)行。
fixedDelay屬性
該屬性的功效與上面的fixedRate則是相反的宫盔,配置了該屬性后會(huì)等到方法執(zhí)行完成后延遲配置的時(shí)間再次執(zhí)行該方法融虽。配置示例如下圖7所示:
我們重啟下項(xiàng)目后查看控制臺(tái)輸出(因?yàn)榉奖悴榭窗阎芭渲玫淖⒔舛家呀?jīng)注釋掉),輸出內(nèi)容如下圖8所示:
可以看到上圖8內(nèi)的輸出內(nèi)容灼芭,時(shí)間間隔是4秒鐘衣形,我們在方法內(nèi)僅僅使線程休眠了3秒鐘,配置方法的延遲執(zhí)行時(shí)間則是1秒鐘姿鸿,證明了確實(shí)是在方法執(zhí)行完成后延遲配置時(shí)間后再次執(zhí)行該方法。
initialDelay屬性
該屬性跟上面的fixedDelay倒源、fixedRate有著密切的關(guān)系苛预,為什么這么說呢?該屬性的作用是第一次執(zhí)行延遲時(shí)間笋熬,只是做延遲的設(shè)定热某,并不會(huì)控制其他邏輯,所以要配合fixedDelay或者fixedRate來使用,配置示例圖下圖9所示:
我們再次重啟項(xiàng)目昔馋,查看控制臺(tái)輸出筹吐,這次我們等待了10秒鐘后才看到了第一次輸出內(nèi)容,如下圖10所示:
可以看到上圖10內(nèi)紅色部分秘遏,項(xiàng)目成功啟動(dòng)的時(shí)間為23:02:06而第一次輸出的時(shí)間則是23:02:16丘薛,證明了我們配置的延遲時(shí)間生效了。第一次加載完成后之后就是每間隔2秒鐘執(zhí)行一邊該方法邦危。
注意上面所有屬性的配置時(shí)間單位都是毫秒洋侨,可根據(jù)項(xiàng)目中實(shí)際情況進(jìn)行時(shí)間單位換算
總結(jié)
上述內(nèi)容就是本章的所有講解內(nèi)容,本章主要講解了SpringBoot項(xiàng)目內(nèi)的定時(shí)任務(wù)如果配置使用倦蚪,上述的屬性是我們實(shí)際項(xiàng)目中最常用到的希坚,可根據(jù)項(xiàng)目實(shí)際情況進(jìn)行選擇配置。