Spring Boot使用方法小札(2):執行定時任務
阿新 • • 發佈:2019-02-05
在Spring Boot中要定時執行一些任務可以不必要使用執行緒來實現,它為我們提供了一種方法來簡化任務的定時執行,這種方式是建立在@EnableScheduling
和@Scheduled
上的。
首先我們需要先建立一個需要定時執行的任務,如下:
@Component
public class ScheduleTask {
@Scheduled(fixedRate=5000)
public void sendMail(){
System.out.println("send mail");
}
}
關於@Scheduled
中兩個經常使用的屬性如下:
fixedDelay
fixedRate
表示每隔多長時間,Spring scheduling會呼叫一次該方法,不論該方法是否執行完;
該註解中還有其他的屬性可以使用,詳細內容檢視JavaDoc
而被@Scheduled
註解的方法也有一些限制規定:
- 方法不能有引數,也就是引數為空;
- 返回值型別必須是
void
在應用程式的啟動類中使用@EnableScheduling
註解,如下:
@SpringBootApplication
@EnableScheduling
public class SpringBootTemplateApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootTemplateApplication.class, args);
}
}
執行Spring Boot程式後,上述程式就會每隔5000ms傳送一次郵件,感覺很簡單有沒有!!
那麼這一切都是怎麼起作用的?首先是從註解@EnableScheduling
開始,看它的原始碼如下:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import (SchedulingConfiguration.class)
@Documented
public @interface EnableScheduling {
}
這裡順便說一下
@Import
註解,這個註解是用來匯入配置類(使用@Configuration
註解的類)的,主要是通過使用註解的配置方式而不是XML配置方式起作用,如果想在註解方式中使用XML方式定義bean可以使用@ImportResource
來標明匯入的配置檔名。另外在Spring 4.2及以後的版本中@Import
註解的配置類不用使用@Configuration
註解也會被當成一個bean來被容器處理。
使用@Import匯入了配置類SchedulingConfiguration
,在這個配置類中配置了一個bean為ScheduledAnnotationBeanPostProcessor
,使用這個bean中的方法processScheduled(...)
來掃描所有已經建立的bean,對所有符合以下條件的方法全部記錄下來:
- 方法被
@Scheduled
註解 - 方法不能有引數,也就是引數為空;
- 返回值型別必須是
void
然後為每一個這樣的任務分配一個排程執行緒,然後根據設定的時間通過該執行緒執行特定的任務。