Spring Boot 定時任務(wù) @Scheduled

項(xiàng)目開發(fā)中經(jīng)常需要執(zhí)行一些定時任務(wù)榆骚,比如在每天凌晨棠涮,需要從 implala 數(shù)據(jù)庫拉取產(chǎn)品功能活躍數(shù)據(jù)谦炬,分析處理后存入到 MySQL 數(shù)據(jù)庫中。類似這樣的需求還有許多黍析,那么怎么去實(shí)現(xiàn)定時任務(wù)呢卖怜,有以下幾種實(shí)現(xiàn)方式。

Java 定時任務(wù)的幾種實(shí)現(xiàn)方式

  • 基于 java.util.Timer 定時器阐枣,實(shí)現(xiàn)類似鬧鐘的定時任務(wù)
  • 使用 Quartz马靠、elastic-job奄抽、xxl-job 等開源第三方定時任務(wù)框架,適合分布式項(xiàng)目應(yīng)用
  • 使用 Spring 提供的一個注解: @Schedule甩鳄,開發(fā)簡單逞度,使用比較方便,也是本文介紹的一種方式

Spring 自身提供了對定時任務(wù)的支持妙啃,本文將介紹 Spring Boot 中 @Scheduled 定時器的使用档泽。

創(chuàng)建定時任務(wù)

首先,在項(xiàng)目啟動類上添加 @EnableScheduling 注解揖赴,開啟對定時任務(wù)的支持

@SpringBootApplication
@EnableScheduling
public class ScheduledApplication {

    public static void main(String[] args) {
        SpringApplication.run(ScheduledApplication.class, args);
    }

}

其中 @EnableScheduling注解的作用是發(fā)現(xiàn)注解@Scheduled的任務(wù)并后臺執(zhí)行馆匿。

其次,編寫定時任務(wù)類和方法燥滑,定時任務(wù)類通過 Spring IOC 加載渐北,使用 @Component 注解,定時方法使用 @Scheduled 注解铭拧。

@Component
public class ScheduledTask {

    @Scheduled(fixedRate = 3000)
    public void scheduledTask() {
        System.out.println("任務(wù)執(zhí)行時間:" + LocalDateTime.now());
    }

}

fixedRate 是 long 類型赃蛛,表示任務(wù)執(zhí)行的間隔毫秒數(shù),以上代碼中的定時任務(wù)每 3 秒執(zhí)行一次搀菩。

運(yùn)行定時工程呕臂,項(xiàng)目啟動和運(yùn)行日志如下,可見每 3 秒打印一次日志執(zhí)行記錄秕磷。

2019-10-16 22:50:04.791  INFO 10610 --- [           main] com.wupx.ScheduledApplication                : Started ScheduledApplication in 1.513 seconds (JVM running for 1.976)
任務(wù)執(zhí)行時間:2019-10-16T22:50:04.791
任務(wù)執(zhí)行時間:2019-10-16T22:50:07.782
任務(wù)執(zhí)行時間:2019-10-16T22:50:10.779

@Scheduled詳解

在上面的入門例子中诵闭,使用了@Scheduled(fixedRate = 3000) 注解來定義每過 3 秒執(zhí)行的任務(wù),對于 @Scheduled 的使用可以總結(jié)如下幾種方式:

  • @Scheduled(fixedRate = 3000) :上一次開始執(zhí)行時間點(diǎn)之后 3 秒再執(zhí)行(fixedRate 屬性:定時任務(wù)開始后再次執(zhí)行定時任務(wù)的延時(需等待上次定時任務(wù)完成)澎嚣,單位毫秒)
  • @Scheduled(fixedDelay = 3000) :上一次執(zhí)行完畢時間點(diǎn)之后 3 秒再執(zhí)行(fixedDelay 屬性:定時任務(wù)執(zhí)行完成后再次執(zhí)行定時任務(wù)的延時(需等待上次定時任務(wù)完成),單位毫秒)
  • @Scheduled(initialDelay = 1000, fixedRate = 3000) :第一次延遲1秒后執(zhí)行瘟芝,之后按fixedRate的規(guī)則每 3 秒執(zhí)行一次(initialDelay 屬性:第一次執(zhí)行定時任務(wù)的延遲時間易桃,需配合fixedDelay或者fixedRate來使用)
  • @Scheduled(cron="0 0 2 1 * ? *") :通過cron表達(dá)式定義規(guī)則

其中,常用的cron表達(dá)式有:

  • 0 0 2 1 * ? * :表示在每月 1 日的凌晨 2 點(diǎn)執(zhí)行
  • 0 15 10 ? * MON-FRI :表示周一到周五每天上午 10:15 執(zhí)行
  • 0 15 10 ? 6L 2019-2020 :表示 2019-2020 年的每個月的最后一個星期五上午 10:15 執(zhí)行
  • 0 0 10,14,16 * * ? :每天上午 10 點(diǎn)锌俱,下午 2 點(diǎn)晤郑,4 點(diǎn)執(zhí)行
  • 0 0/30 9-17 * * ? :朝九晚五工作時間內(nèi)每半小時執(zhí)行
  • 0 0 12 ? * WED :表示每個星期三中午 12 點(diǎn)執(zhí)行
  • 0 0 12 * * ? :每天中午 12點(diǎn)執(zhí)行
  • 0 15 10 ? * * :每天上午 10:15 執(zhí)行
  • 0 15 10 * * ? :每天上午 10:15 執(zhí)行
  • 0 15 10 * * ? * :每天上午 10:15 執(zhí)行
  • 0 15 10 * * ? 2019 :2019 年的每天上午 10:15 執(zhí)行

總結(jié)

本文主要介紹了基于 Spring Boot 內(nèi)置的定時任務(wù)的配置使用,主要涉及兩個注解贸宏,四個屬性的配置:

  • 主程序入口 @EnableScheduling 開啟定時任務(wù)
  • 定時方法上 @Scheduled 設(shè)置定時
  • cron屬性:按cron規(guī)則執(zhí)行
  • fixedRate 屬性:以固定速率執(zhí)行
  • fixedDelay 屬性:上次執(zhí)行完畢后延遲再執(zhí)行
  • initialDelay 屬性:第一次延時執(zhí)行造寝,第一次執(zhí)行完畢后延遲后再次執(zhí)行

參考

https://spring.io/guides/gs/scheduling-tasks/

https://www.tutorialspoint.com/spring_boot/spring_boot_scheduling.htm

https://docs.spring.io/spring/docs/2.5.x/reference/scheduling.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市吭练,隨后出現(xiàn)的幾起案子诫龙,更是在濱河造成了極大的恐慌,老刑警劉巖鲫咽,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件签赃,死亡現(xiàn)場離奇詭異谷异,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)锦聊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進(jìn)店門歹嘹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人孔庭,你說我怎么就攤上這事尺上。” “怎么了圆到?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵尖昏,是天一觀的道長。 經(jīng)常有香客問我构资,道長抽诉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任吐绵,我火速辦了婚禮迹淌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘己单。我一直安慰自己唉窃,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布纹笼。 她就那樣靜靜地躺著纹份,像睡著了一般。 火紅的嫁衣襯著肌膚如雪廷痘。 梳的紋絲不亂的頭發(fā)上蔓涧,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天,我揣著相機(jī)與錄音笋额,去河邊找鬼元暴。 笑死,一個胖子當(dāng)著我的面吹牛兄猩,可吹牛的內(nèi)容都是我干的茉盏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼枢冤,長吁一口氣:“原來是場噩夢啊……” “哼鸠姨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起淹真,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤讶迁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后趟咆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體添瓷,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡梅屉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鳞贷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坯汤。...
    茶點(diǎn)故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖搀愧,靈堂內(nèi)的尸體忽然破棺而出惰聂,到底是詐尸還是另有隱情,我是刑警寧澤咱筛,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布搓幌,位于F島的核電站,受9級特大地震影響迅箩,放射性物質(zhì)發(fā)生泄漏溉愁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一饲趋、第九天 我趴在偏房一處隱蔽的房頂上張望拐揭。 院中可真熱鬧,春花似錦奕塑、人聲如沸堂污。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盟猖。三九已至,卻和暖如春换棚,著一層夾襖步出監(jiān)牢的瞬間式镐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工圃泡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留碟案,地道東北人。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓颇蜡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親辆亏。 傳聞我的和親對象是個殘疾皇子风秤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評論 2 355