• Spring注解方式实现任务调度【官方文档翻译】


    原文: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>
    
  • 相关阅读:
    已整理Linux进程概念与常用操作
    Linux vsftpd服务配置
    已整理制作ceph离线安装包
    时间同步服务与客户端配置
    已整理rpm 包管理与yum服务器配置操作
    通用池化框架GenericObjectPool性能测试
    红利、辛苦钱、利润和工资【读书笔记】
    通用池化框架GenericKeyedObjectPool性能测试
    国际化和本地化测试
    Redis stream Java API实践
  • 原文地址:https://www.cnblogs.com/interdrp/p/3599917.html
Copyright © 2020-2023  润新知