在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