在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();
}
}