原文:http://docs.spring.io/spring/docs/4.0.1.BUILD-SNAPSHOT/javadoc-api/ 注解類型:EnableScheduling @Target(value=TYPE) @Retention(value=RUNTIME) @Import(value=SchedulingConfiguration.class) @Documented public @interface EnableScheduling 使用該注解讓Spring可以進行任務調度,功能類似於Spring的xml命名空間<task:*> 使用 @EnableScheduling 注解的類示例: @Configuration @EnableScheduling public class AppConfig { // 各種@bean的定義 // various @Bean definitions } 使用@Scheduled注解可以被Spring容器檢測。使用示例: package com.myco.tasks; public class MyTask { @Scheduled(fixedRate=1000) public void work() { // 任務執行邏輯 // task execution logic } } 下面的配置使MyTask.work()每1000毫秒被執行一次: @Configuration @EnableScheduling public class AppConfig { @Bean public MyTask task() { return new MyTask(); } } 如果MyTask使用了@Component注解,下面的配置方式也可以讓使用了@Scheduled注解的方法在設置的時間間隔里面被調用: @Configuration @ComponentScan(basePackages="com.myco.tasks") public class AppConfig { } 使用了@Scheduled注解方法也可以在使用了@Configuration注解的類里面使用: @Configuration @EnableScheduling public class AppConfig { @Scheduled(fixedRate=1000) public void work() { // task execution logic } } 上面介紹的都是在單線程的情況下執行任務調度的。如果希望進行更多的控制,我們可以讓使用@Configuration注解的類實現SchedulingConfigurer接口,這樣就可以訪問底層的ScheduledRegistrar實例。 下面的例子演示如何定制Executer去執行任務計划: @Configuration @EnableScheduling public class AppConfig implements SchedulingConfigurer { @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.setScheduler(taskExecutor()); } @Bean(destroyMethod="shutdown") public Executor taskExecutor() { return Executors.newScheduledThreadPool(100); } } 注意上面例子中使用的@bean(destroyMethod="shutdown")。這樣是為了確保當Spring應用上下文關閉的時候任務執行者也被正確地關閉。實現SchedulingConfigurar接口還允許細粒度控制任務通過ScheduledTaskRegistrar進行登記。 例如,下面的配置使用自定義的Trigger執行bean的方法 @Configuration @EnableScheduling public class AppConfig implements SchedulingConfigurer { @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.setScheduler(taskScheduler()); taskRegistrar.addTriggerTask( new Runnable() { public void run() { myTask().work(); } }, new CustomTrigger() ); } @Bean(destroyMethod="shutdown") public Executor taskScheduler() { return Executors.newScheduledThreadPool(42); } @Bean public MyTask myTask() { return new MyTask(); } } 作為參考,上面的例子和下面使用XML配置方式的作用是一樣的: <beans> <task:annotation-driven scheduler="taskScheduler"/> <task:scheduler id="taskScheduler" pool-size="42"/> <task:scheduled ref="myTask" method="work" fixed-rate="1000"/> <bean id="myTask" class="com.foo.MyTask"/> </beans>