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

相關文章
相關標籤/搜索