1. 程式人生 > >Spring Boot使用方法小札(2):執行定時任務

Spring Boot使用方法小札(2):執行定時任務

在Spring Boot中要定時執行一些任務可以不必要使用執行緒來實現,它為我們提供了一種方法來簡化任務的定時執行,這種方式是建立在@EnableScheduling@Scheduled上的。
首先我們需要先建立一個需要定時執行的任務,如下:

@Component
public class ScheduleTask {

    @Scheduled(fixedRate=5000)
    public void sendMail(){
        System.out.println("send mail");
    }
}

關於@Scheduled中兩個經常使用的屬性如下:

  • fixedDelay
    表示當方法執行完畢後多長時間,Spring scheduling會再次呼叫該方法;
  • 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,對所有符合以下條件的方法全部記錄下來:

  1. 方法被@Scheduled註解
  2. 方法不能有引數,也就是引數為空;
  3. 返回值型別必須是void

然後為每一個這樣的任務分配一個排程執行緒,然後根據設定的時間通過該執行緒執行特定的任務。