在spring的<task:*> XML名字空間功能同樣,使用在Configuration類以下:
@Configuration
@EnableScheduling
public class AppConfig {
//@Bean 定義
}
在spring容器管理bean中檢測@Scheduled註解。如:
package com.myco.task;
public class MyTask {
@Scheduled(fixedRate=1000)
public void work() {
//task execution logic
}
}
下面的配置保證MyTask.work()每1s調用一次
@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接口。
這允許訪問底層實例,怎樣定製Executor執行調度任務:
@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);
}
}
//destroyMethod="shutdown"當spring應用上下文關閉時確保任務執行器能正確的關閉
實現SchedulingConfigurer也允許經過ScheduledTaskRegistrar細粒度控制任務註冊。
如如下配置特定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();
}
}spring