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

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

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

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

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、啟動並測試定時任務的執行情況

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

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

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

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

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

5、文章源碼地址

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

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


分享到:


相關文章: