springBoot自帶定時任務schedule用法詳解

定時任務不管哪個項目或多或少都會有用到,那定時任務可以用來幹嘛?

定時任務的作用相信很多碼友都知道,這裡就簡單介紹一下,spring項目啟動後想對一些數據做同步,一些表數據要不定時統計,一些業務報表的彙總和生成,大量數據導入後臺處理,一般都是用定時任務去處理,對於太佔資源的任務需要後臺處理,越複雜的系統定時任務也越多,需要監控的東西也很多。

springBoot也提供了簡單的定時任務支持,文章中的代碼也是接著上一次的項目來講,也可以自己創建一個新項目,因為著節的內容沒有很多複雜的配置。

1、創建定時任務業務實現類

在service創建一個ScheduleServiceImpl類

package com.apgblogs.springbootstudy.service; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; /** * @author xiaomianyang * @description * @date 2019-07-14 10:19 */ @Service public class ScheduleServiceImpl { private Logger logger= LoggerFactory.getLogger(ScheduleServiceImpl.class); int count1 = 1; int count2 = 1; int count3 = 1; @Scheduled(fixedRate = 1000) @Async public void jobFixedRate(){ Thread.currentThread().setName("間隔執行"); logger.info("{}.執行第{}次",Thread.currentThread().getName(),count1++); } @Scheduled(fixedRateString = "${job.fixedRate}") @Async public void jobFixedRateString(){ Thread.currentThread().setName("spel表達式間隔執行"); logger.info("{}.執行第{}次",Thread.currentThread().getName(),count2++); } @Scheduled(fixedDelay = 3000) @Async public void jobFixedDelay() throws InterruptedException{ Thread.sleep(1000); Thread.currentThread().setName("上次任務完成後間隔執行"); logger.info("{}.執行第{}次",Thread.currentThread().getName(),count3++); } @Scheduled(initialDelay = 8000,fixedRate = 1000) @Async public void jobInitialDelay(){ Thread.currentThread().setName("spring容器完成後間隔執行"); logger.info("{}.執行第{}次",Thread.currentThread().getName(),count3++); } @Scheduled(cron = "0 * 11 * * ?") @Async public void jobCron(){ Thread.currentThread().setName("cron表達式執行"); logger.info("{}.執行第{}次",Thread.currentThread().getName(),count3++); } }

2、在啟動類上添加啟用調度註解

在啟動類加上@EnableScheduling註解,我這裡其他註解因為集成其他功能,如果是新項目就不用加了

package com.apgblogs.springbootstudy; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication @EnableJpaAuditing @MapperScan("com.apgblogs.springbootstudy.dao") @EnableCaching @EnableScheduling public class SpringBootStudyApplication { public static void main(String[] args) { SpringApplication.run(SpringBootStudyApplication.class, args); } }

3、啟動並測試定時任務的執行情況

可以看到輸出的日誌,說明定時任務就起作用了

4、cron表達式一些常用格式

cron表達式是很強大的,對於各種複雜的定時計劃都能表示,比如每年的那個月那一天那個時間範圍內每隔多少秒去執行,cron表達式都可以表示出來,下面是一些常用的時間格式

5、文章源碼地址

關注+轉發後私信我源碼地址,感謝支持,後期會有更多關於springBoot和springCloud的實例文章,包括很火的微服務,docker容器編排,分佈式架構,千萬級併發設計等。

現在定時任務就已經可以使用了,如果項目中有這種需求的就可以這樣來處理了,但是有個問題,上面的需求只能滿足固定的時間,那假如用戶想自定義任務執行時間呢,或者用戶想手動執行呢,這個springBoot的schedule就很難滿足需求了,這時候就會用到比較強大的quartz,這個第三方任務調度插件可以完成各種複雜需求,記得關注我哦,下一篇文章就會詳細講解。