原文:http://docs.spring.io/spring/docs/4.0.1.BUILD-SNAPSHOT/javadoc-api/java
註解類型:EnableScheduling
spring
@Target(value=TYPE) @Retention(value=RUNTIME) @Import(value=SchedulingConfiguration.class) @Documented public @interface EnableScheduling
使用該註解讓Spring能夠進行任務調度,功能相似於Spring的xml命名空間<task:*>
api
使用 @EnableScheduling 註解的類示例:ide
@Configuration @EnableScheduling public class AppConfig { // 各類@bean的定義 // various @Bean definitions }
使用@Scheduled註解能夠被Spring容器檢測。使用示例:
spa
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註解的方法在設置的時間間隔裏面被調用:
code
@Configuration @ComponentScan(basePackages="com.myco.tasks") public class AppConfig { }
使用了@Scheduled註解方法也能夠在使用了@Configuration註解的類裏面使用:
xml
@Configuration @EnableScheduling public class AppConfig { @Scheduled(fixedRate=1000) public void work() { // task execution logic } }
上面介紹的都是在單線程的狀況下執行任務調度的。若是但願進行更多的控制,咱們能夠讓使用@Configuration註解的類實現SchedulingConfigurer接口,這樣就能夠訪問底層的ScheduledRegistrar實例。接口
下面的例子演示如何定製Executer去執行任務計劃:
get
@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>