@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 |
, - * / |