天天看點

使用springboot時,@Scheduled定時器遇到的問題

 @Scheduled 這個注解确實給我們帶了很大的友善,我們隻要加上該注解,并且根據需求設定好就可以使用定時任務了。

但是,我們需要注意的是,@Scheduled 并不一定一定會按時執行。

因為使用@Scheduled 的定時任務雖然是異步執行的,但是,不同的定時任務之間并不是并行的!!!!!!!!

在其中一個定時任務沒有執行完之前,其他的定時任務即使是到了執行時間,也是不會執行的,它們會進行排隊。

也就是如果你想你不同的定時任務互不影響,到時間就會執行,那麼你最好将你的定時任務方法自己搞成異步方法,這樣,

定時任務其實就相當于調用了一個線程執行任務,一瞬間就結束了。當然,也可以勉強當做是任務都會定時執行。

下面說一下@Scheduled 注解的幾個參數:

1、可以通過配置檔案配置進來的

//  使用表達式,該表達式表示每一秒中執行一次。如果上一次方法超過了定時時間還沒有執行完,那麼下一次定時不會執行,
//  直到上次方法執行完後,就會立即執行下一次的定時任務
//  該方式在工程啟動的時候,并不會立即執行,會按照定時表達式的規律進行執行。例如這裡,就是1秒後才會執行。
    @Scheduled(cron="0/1 * * * * ?")        

           
// 使用固定速率。該表達式表示每隔一秒鐘執行一次。如果上一次方法超過了1秒鐘還沒執行完,下一次任務也不會執行,直到
// 上次方法執行完,下次的定時就會立即執行。
// 該方式在工程啟動的時候,會立即執行,接下來會按規律進行執行。
            
@Scheduled(fixedRateString="1000")   // 機關:毫秒
           
// 該方式和上一個的不同在于多加了一個參數,這個參數是一個初始化參數。
// 加上initialDelayString後,在剛啟動的時候,就不會立即執行了,而是會等到10秒之後才會執行,即使fixedRateString才
// 1秒鐘。也會在10秒後才會第一次執行。
// 注意:initialDelayString不能喝cron組合使用。  
            
@Scheduled(fixedRateString="1000",initialDelayString="10000")
           
// 使用固定延遲。該表達式表示每次執行完後一秒再次執行。每一次執行,無論執行多長時間,下一次執行都會在上一次方法
// 執行完後,再過一秒鐘,再次執行。
// 該方式在工程啟動的時候,會立即執行,接下來會按規律進行執行。
   @Scheduled(fixedDelayString="1000")
           
2、不可通過配置檔案配置的 (作用相同)
@Scheduled(fixedRate=1000)      // 它們都是接受一個long類型的參數
           
@Scheduled(fixedDelay=1000)
           
@Scheduled(fixedRate=1000,initialDelay=10000)
           
這裡粘貼一下cron表達式的規則:   字段                     允許值                                允許的特殊字元

0-59

, - * /

0-59

, - * /

小時

0-23

, - * /

日期

1-31

, - * ? / L W C

月份

1-12 或者 JAN-DEC

, - * /

星期

1-7 或者 SUN-SAT

, - * ? / L C #

年(可選)

留白, 1970-2099

, - * /