1. 程式人生 > >使用springboot時,@Scheduled定時器遇到的問題

使用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   , - * /