SpringBoot多線程并發(fā)定時任務

剛剛看了下Spring Boot實現(xiàn)定時任務的文章,感覺還不錯稚机。Spring Boot 使用Spring自帶的Schedule來實現(xiàn)定時任務變得非常簡單和方便染簇。在這里個大家分享下。

開啟緩存注解

@SpringBootApplication
@EnableScheduling //開啟定時任務
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

編寫定時任務

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

@Component
@Slf4j
public class ScheduledTasks {

    // cron接受cron表達式瘸羡,根據(jù)cron表達式確定定時規(guī)則
    @Scheduled(cron="0/5 * * * * ? ")   //每5秒執(zhí)行一次
    public void testCron() {
        DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        log.info(sdf.format(new Date())+"*********每5秒執(zhí)行一次");
    }
}

任務完成

啟動項目府阀,查看控制臺打印信息,發(fā)現(xiàn)定時任務已經(jīng)生效缆镣。spring boot 和Scheduled整合完畢。


存在問題

但是后來發(fā)現(xiàn)個問題试浙,通過同時測試幾個任務發(fā)現(xiàn)董瞻,所有的任務都是在同一個線程池中的同一個線程來完成的。在實際開發(fā)過程中田巴,我們當然不希望所有的任務都運行在一個線程中钠糊。

   @Scheduled(cron="0/1 * * * * ? ")   //每1秒執(zhí)行一次 
    public void testCron1() {
       DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
        logger.info(sdf.format(new Date())+"*********每1秒執(zhí)行一次");
    }
   
   @Scheduled(cron="0/2 * * * * ? ")   //每2秒執(zhí)行一次 
    public void testCron2() {
       DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
        logger.info(sdf.format(new Date())+"*********每2秒執(zhí)行一次");
    }
   
   @Scheduled(cron="0/3 * * * * ? ")   //每3秒執(zhí)行一次 
    public void testCron3() {
       DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
        logger.info(sdf.format(new Date())+"*********每3秒執(zhí)行一次");
    }
   
   @Scheduled(cron="0/4 * * * * ? ")   //每4秒執(zhí)行一次 
    public void testCron4() {
       DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
        logger.info(sdf.format(new Date())+"*********每4秒執(zhí)行一次");
    }

解決方案

那么,怎么設計成多線程實現(xiàn)并發(fā)呢壹哺?在網(wǎng)上看到過這樣的解決方案眠蚂。通過ScheduleConfig配置文件實現(xiàn)SchedulingConfigurer接口,并重寫setSchedulerfang方法斗躏,我們嘗試著配置了一下。

@Configuration
public class ScheduleConfig implements SchedulingConfigurer {
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        //當然了昔脯,這里設置的線程池是corePoolSize也是很關鍵了啄糙,自己根據(jù)業(yè)務需求設定
        taskRegistrar.setScheduler(Executors.newScheduledThreadPool(5));
        
        
        /**為什么這么說呢?
        假設你有4個任務需要每隔1秒執(zhí)行云稚,而其中三個都是比較耗時的操作可能需要10多秒隧饼,而你上面的語句是這樣寫的:
        taskRegistrar.setScheduler(newScheduledThreadPool(3));
        那么仍然可能導致最后一個任務被阻塞不能定時執(zhí)行
        **/
    }
}

整合成功

這樣就完成了多線程并發(fā)的配置?我們啟動項目通過控制臺輸出信息驗證一下結果静陈,最后發(fā)現(xiàn)所有的任務都在同一個線程池但不同線程中完成燕雁,說明這個方案完全可行,這樣鲸拥,我們就完成了spring boot 多線程并發(fā)定時任務拐格。


  • @Scheduled所支持的參數(shù):
    1.cron:cron表達式,指定任務在特定時間執(zhí)行刑赶;
    2.fixedDelay:表示上一次任務執(zhí)行完成后多久再次執(zhí)行捏浊,參數(shù)類型為long,單位ms撞叨;
    3.fixedDelayString:與fixedDelay含義一樣金踪,只是參數(shù)類型變?yōu)镾tring浊洞;
    4.fixedRate:表示按一定的頻率執(zhí)行任務,參數(shù)類型為long胡岔,單位ms法希;
    5.fixedRateString: 與fixedRate的含義一樣,只是將參數(shù)類型變?yōu)镾tring靶瘸;
    6.initialDelay:表示延遲多久再第一次執(zhí)行任務苫亦,參數(shù)類型為long,單位ms奕锌;
    7.initialDelayString:與initialDelay的含義一樣著觉,只是將參數(shù)類型變?yōu)镾tring;
    8.zone:時區(qū)惊暴,默認為當前時區(qū)饼丘,一般沒有用到。

  • Cron表達式范例:
    每隔5秒執(zhí)行一次:*/5 * * * * ?
    每隔1分鐘執(zhí)行一次:0 */1 * * * ?
    每天23點執(zhí)行一次:0 0 23 * * ?
    每天凌晨1點執(zhí)行一次:0 0 1 * * ?
    每月1號凌晨1點執(zhí)行一次:0 0 1 1 * ?
    每月最后一天23點執(zhí)行一次:0 0 23 L * ?
    每周星期天凌晨1點實行一次:0 0 1 ? * L
    在26分辽话、29分肄鸽、33分執(zhí)行一次:0 26,29,33 * * * ?
    每天的0點、13點油啤、18點典徘、21點都執(zhí)行一次:0 0 0,13,18,21 * * ?

其實不會Cron表達式也不用擔心,網(wǎng)上有好多在線Cron生成器益咬,我們完全可以通過在線生成器生成符合要求的cron逮诲,也很方便。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末幽告,一起剝皮案震驚了整個濱河市梅鹦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌冗锁,老刑警劉巖齐唆,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異冻河,居然都是意外死亡箍邮,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門叨叙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锭弊,“玉大人,你說我怎么就攤上這事摔敛⊥⑷兀” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長桃犬。 經(jīng)常有香客問我刹悴,道長,這世上最難降的妖魔是什么攒暇? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任土匀,我火速辦了婚禮,結果婚禮上形用,老公的妹妹穿的比我還像新娘就轧。我一直安慰自己,他們只是感情好田度,可當我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布妒御。 她就那樣靜靜地躺著,像睡著了一般镇饺。 火紅的嫁衣襯著肌膚如雪乎莉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天奸笤,我揣著相機與錄音惋啃,去河邊找鬼。 笑死监右,一個胖子當著我的面吹牛边灭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播健盒,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼绒瘦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了扣癣?” 一聲冷哼從身側響起椭坚,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎搏色,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體券册,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡频轿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了烁焙。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片航邢。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖骄蝇,靈堂內(nèi)的尸體忽然破棺而出膳殷,到底是詐尸還是另有隱情,我是刑警寧澤九火,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布赚窃,位于F島的核電站册招,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏勒极。R本人自食惡果不足惜是掰,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望辱匿。 院中可真熱鬧键痛,春花似錦、人聲如沸匾七。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昨忆。三九已至丁频,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間扔嵌,已是汗流浹背限府。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留痢缎,地道東北人胁勺。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像独旷,于是被迫代替她去往敵國和親署穗。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容