使用springboot時,@Scheduled定時器遇到的問題
阿新 • • 發佈:2018-11-10
@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 |
, - * / |