springboot定時任務配置

情景1:客戶端訪問服務器的結果實際上是每個一段時間發生一次變化,並且在服務器在每天的某個固定的時間點都要觸發一次事件。我們當然可以在遇到每一個請求時都重新計算結果,但是爲了提高效率,我們顯然可以讓服務器每隔一段時間計算一次結果,並且把這個結果進行保存,對在下一個時間段內的每個請求都直接返回計算後的結果。這樣就能較好的提高了服務器的性能。

情景2:定時的解析某些數據

情景3:實現定時的提交git提交

情景4:定時的發郵件

情景5:定時的刪除或者移動文件啦。。等等

。。。。。。。。。。。。。。。。。。。。。。。。。

那麼問題就在於如何處理定時任務。其實SpringBoot早就提供了非常方便的接口,但是網上的介紹還是有點亂的,我就記錄下具體操作的注意點方便以後查找。

創建定時服務

一般來說定時服務會寫在一個Component裏,方便管理。對於定時任務,我們其實只要在需要定時執行的函數前加上 @Scheduled 註解,比如下面這樣:

?

1

2

3

4

5

6

7

@Component

public class ScheduledTask{

  @Scheduled(fixedRate = 5000)

  public void scheduledTask(){

    //do sth...

  }

}

與此同時,我們還要在項目的啓動文件裏配置上 @EnableScheduling 註解,告訴項目我們是支持定時任務的:

?

1

2

3

4

5

6

7

@SpringBootApplication

@EnableScheduling

public class LotteryApplication{

 public static void main(String[] args){

 SpringApplication.run(LotteryApplication.class, args);

 }

}

這樣我們的函數就能定時執行了。

 

Scheduled主要支持 fixRate , fixDelay , cron , initialDelay 這些參數,下面做簡要說明。

一、fixRate和fixDelay

    fixRate和fixDelay參數都指定了函數每隔某個毫秒數執行一次,但是他們之間也有細小的差別。

    fixRate

        fixRate的計時是相對於系統時間的,也就是一定相隔會固定時間執行。

    fixDelay

        fixDelay的計時是相對於上一次調用的時間的,因此他受其他程序調用的影響,如果該函數在其他地方被手動調用,那麼這個計時器就會重新計時。

二、initialDelay參數

    initialDelay參數是個額外參數,比較簡單,就是指定從項目開始運行到該函數首次被調用的執行時間,以毫秒計。

    如果不指定這個參數,這個值就是-1,也就是程序開始時不執行。

    在不知到initialDelay這個參數的時候爲了讓程序啓動時立即調用該函數,我讓這個定時類繼承了 InitializingBean 並在重寫的 afterPropertiesSet 方法中手動調用了這個函數。。。現在看起來還真是愚蠢。。。

三、cron

    這個Cron是最複雜也是高度自定義化的定時工具,在Linux系統裏也有類似的crontab命令。他其實是更加細緻的定義了定時任務,以一個字符串的形式進行表示。

    在SpringBoot中,一個cron字符串是由六個部分以空格組成的字符串,文檔中的例子是這樣的:

?

1

2

3

4

5

6

7

"0 0 * * * *" = the top of every hour of every day.

"*/10 * * * * *" = every ten seconds.

"0 0 8-10 * * *" = 8, 9 and 10 o'clock of every day.

"0 0 6,19 * * *" = 6:00 AM and 7:00 PM every day.

"0 0/30 8-10 * * *" = 8:00, 8:30, 9:00, 9:30, 10:00 and 10:30 every day.

"0 0 9-17 * * MON-FRI" = on the hour nine-to-five weekdays

"0 0 0 25 12 ?" = every Christmas Day at midnight

    六個部分分別表示秒、分、時、日、月、周。    

    他支持'-‘表示範圍,'*'表示通配,'/‘表示在左邊的時間匹配後間隔右邊的時間,'?'一般表示周的通配。

    具體的使用方法還要參考相關文檔。

        http://blog.csdn.net/u012477338/article/details/46908195

    網上有很多類似 Cron表達式測試工具 這樣的測試工具,方便我們測試自己寫的Cron表達式。

        http://cron.qqe2.com/

    下面一個例子表示每隔五分鐘執行一次:

?

1

2

3

4

@Scheduled(cron = "0 0/5 * * * ?")

public void fiveMinutes(){

  //do sth.

}

四、注意點

    在實際使用Scheduled註解時,我們一定要指定且僅僅指定fixRate、fixDelay、cron當中的一個,否則肯定會導致錯誤。當然,我們可以任意指定initialDelay參數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章