@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表達式的規則:
字段 允許值 允許的特殊字元
| | |
| | |
| | |
| | |
| | |
| | |
| | |