Spring注解方式实现任务调度

原文: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>
相关文章
相关标签/搜索