原文: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>