spring-boot | 多線程并發(fā)定時任務(wù)

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

開啟緩存注解

@SpringBootApplication
@EnableScheduling //開啟定時任務(wù)
public class Application {

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

編寫定時任務(wù)

@Component
public class ScheduledTasks {

    private Logger logger = LoggerFactory.getLogger(ScheduledTasks.class);

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

任務(wù)完成

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



存在問題

但是后來發(fā)現(xiàn)個問題,通過同時測試幾個任務(wù)發(fā)現(xiàn)荐健,所有的任務(wù)都是在同一個線程池中的同一個線程來完成的酱畅。在實際開發(fā)過程中,我們當(dāng)然不希望所有的任務(wù)都運行在一個線程中江场。

@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í)行一次");
    }

解決方案

那么纺酸,怎么設(shè)計成多線程實現(xiàn)并發(fā)呢?在網(wǎng)上看到過這樣的解決方案址否。通過ScheduleConfig配置文件實現(xiàn)SchedulingConfigurer接口餐蔬,并重寫setSchedulerfang方法,我們嘗試著配置了一下佑附。


@Configuration
public class ScheduleConfig implements SchedulingConfigurer {
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        
        taskRegistrar.setScheduler(Executors.newScheduledThreadPool(5));
    }
}

整合成功

這樣就完成了多線程并發(fā)的配置樊诺?我們啟動項目通過控制臺輸出信息驗證一下結(jié)果,最后發(fā)現(xiàn)所有的任務(wù)都在同一個線程池但不同線程中完成音同,說明這個方案完全可行词爬,這樣,我們就完成了spring boot 多線程并發(fā)定時任務(wù)权均。


@Scheduled所支持的參數(shù):

1.cron:cron表達(dá)式顿膨,指定任務(wù)在特定時間執(zhí)行;
2.fixedDelay:表示上一次任務(wù)執(zhí)行完成后多久再次執(zhí)行叽赊,參數(shù)類型為long恋沃,單位ms;
3.fixedDelayString:與fixedDelay含義一樣必指,只是參數(shù)類型變?yōu)镾tring囊咏;
4.fixedRate:表示按一定的頻率執(zhí)行任務(wù),參數(shù)類型為long塔橡,單位ms梅割;
5.fixedRateString: 與fixedRate的含義一樣,只是將參數(shù)類型變?yōu)镾tring葛家;
6.initialDelay:表示延遲多久再第一次執(zhí)行任務(wù)炮捧,參數(shù)類型為long,單位ms惦银;
7.initialDelayString:與initialDelay的含義一樣,只是將參數(shù)類型變?yōu)镾tring;
8.zone:時區(qū)扯俱,默認(rèn)為當(dāng)前時區(qū)书蚪,一般沒有用到。

Cron表達(dá)式范例:

每隔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表達(dá)式也不用擔(dān)心,網(wǎng)上有好多在線Cron生成器让簿,我們完全可以通過在線生成器生成符合要求的cron敬察,也很方便。

(完)


參考文章
SpringBoot定時任務(wù)及Cron表達(dá)式詳解

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末尔当,一起剝皮案震驚了整個濱河市莲祸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌椭迎,老刑警劉巖锐帜,帶你破解...
    沈念sama閱讀 223,126評論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異畜号,居然都是意外死亡缴阎,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評論 3 400
  • 文/潘曉璐 我一進店門简软,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛮拔,“玉大人,你說我怎么就攤上這事替饿∮镌螅” “怎么了?”我有些...
    開封第一講書人閱讀 169,941評論 0 366
  • 文/不壞的土叔 我叫張陵视卢,是天一觀的道長踱卵。 經(jīng)常有香客問我,道長据过,這世上最難降的妖魔是什么惋砂? 我笑而不...
    開封第一講書人閱讀 60,294評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮绳锅,結(jié)果婚禮上西饵,老公的妹妹穿的比我還像新娘。我一直安慰自己鳞芙,他們只是感情好眷柔,可當(dāng)我...
    茶點故事閱讀 69,295評論 6 398
  • 文/花漫 我一把揭開白布期虾。 她就那樣靜靜地躺著,像睡著了一般驯嘱。 火紅的嫁衣襯著肌膚如雪镶苞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,874評論 1 314
  • 那天鞠评,我揣著相機與錄音茂蚓,去河邊找鬼。 笑死剃幌,一個胖子當(dāng)著我的面吹牛聋涨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播负乡,決...
    沈念sama閱讀 41,285評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼牍白,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了敬鬓?” 一聲冷哼從身側(cè)響起淹朋,我...
    開封第一講書人閱讀 40,249評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎钉答,沒想到半個月后础芍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,760評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡数尿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,840評論 3 343
  • 正文 我和宋清朗相戀三年仑性,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片右蹦。...
    茶點故事閱讀 40,973評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡诊杆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出何陆,到底是詐尸還是另有隱情晨汹,我是刑警寧澤,帶...
    沈念sama閱讀 36,631評論 5 351
  • 正文 年R本政府宣布贷盲,位于F島的核電站淘这,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏巩剖。R本人自食惡果不足惜铝穷,卻給世界環(huán)境...
    茶點故事閱讀 42,315評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望佳魔。 院中可真熱鬧曙聂,春花似錦、人聲如沸鞠鲜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至朦佩,卻和暖如春并思,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背语稠。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評論 1 275
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留弄砍,地道東北人仙畦。 一個月前我還...
    沈念sama閱讀 49,431評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像音婶,于是被迫代替她去往敵國和親慨畸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,982評論 2 361

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