首页 > 代码库 > Scheduling Tasks

Scheduling Tasks

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

Scheduling Tasks