Spring Boot中@Scheduled注解的使用方法
一、定時任務注解為@Scheduled,使用方式舉例如下
//定義一個按時間執行的定時任務,在每天16:00執行一次。
@Scheduled(cron = "0 0 16 * * ?")
public void depositJob() {
//執行代碼
}
//定義一個按一定頻率執行的定時任務,每隔1分鍾執行一次
@Scheduled(fixedRate = 1000 * 60)
public void job2() {
//執行代碼
}
//定義一個按一定頻率執行的定時任務,每隔1分鍾執行一次,延遲1秒執行
@Scheduled(fixedRate = 1000 * 60,initialDelay = 1000)
public void updatePayRecords() {
//執行代碼
}
對於fixedRate屬性來說,它接受的是一個Long類型的參數,該數值的單位是毫秒(1000毫秒=1秒)。
二、@Scheduled代碼執行原理說明
簡要介紹:spring在初始化bean后,通過“postProcessAfterInitialization”攔截到所有的用到“@Scheduled”注解的方法,並解析相應的的注解參數,放入“定時任務列表”等待后續處理;之后再“定時任務列表”中統一執行相應的定時任務(任務為順序執行,先執行cron,之后再執行fixedRate)。
其次,再介紹一下fixedRate和fixedDelay和cron的區別
注解@Scheduled 可以作為一個觸發源添加到一個方法中,例如,以下的方法將以一個固定延遲時間5秒鍾調用一次執行,這個周期是以上一個調用任務的完成時間為基准,在上一個任務完成之后,5s后再次執行:
@Scheduled(fixedDelay=5000)
public void doSomething() {
// something that should execute periodically
}
如果需要以固定速率執行,只要將注解中指定的屬性名稱改成fixedRate即可,以下方法將以一個固定速率5s來調用一次執行,這個周期是以上一個任務開始時間為基准,從上一任務開始執行后5s再次調用:
@Scheduled(fixedRate=5000)
public void doSomething() {
// something that should execute periodically
}
對於固定延遲和固定速率的任務,可以指定一個初始延遲表示該方法在第一被調用執行之前等待的毫秒數:
@Scheduled(initialDelay=1000, fixedRate=5000)
public void doSomething() {
// something that should execute periodically
}
如果簡單的定期調度不能滿足,那么cron表達式提供了可能。例如,下面的方法將只會在工作日執行:
@Scheduled(cron="*/5 * * * * MON-FRI")
public void doSomething() {
// something that should execute on weekdays only
}
還可以通過使用zone屬性來指定cron表達式被調用的時區。
注意:
1、spring的注解@Scheduled 需要寫在實現方法上;
2、定時器的任務方法不能有返回值(如果有返回值,spring初始化的時候會告訴你有個錯誤、需要設定一個proxytargetclass的某個值為true),不能指向任何的參數;
3、如果該方法需要與應用程序上下文的其他對象進行交互,通常是通過依賴注入來實現;
4、實現類上要有組件的注解@Component。
