springboot集成scheduled

JAVA && Spring && SpringBoot2.x — 学习目录

1. ScheduledThreadPoolExecutor线程池
2. SpringBoot2.X整合定时线程池(ScheduledThreadPoolExecutor)

1. SpringBoot对ScheduledThreadPoolExecutor线程池的自动装配

源码:org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration

public class TaskSchedulingAutoConfiguration {

    @Bean
    @ConditionalOnBean(name = TaskManagementConfigUtils.SCHEDULED_ANNOTATION_PROCESSOR_BEAN_NAME)
    @ConditionalOnMissingBean({ SchedulingConfigurer.class, TaskScheduler.class, ScheduledExecutorService.class })
    public ThreadPoolTaskScheduler taskScheduler(TaskSchedulerBuilder builder) {
        return builder.build();
    }

    @Bean
    @ConditionalOnMissingBean
    public TaskSchedulerBuilder taskSchedulerBuilder(TaskSchedulingProperties properties,
            ObjectProvider taskSchedulerCustomizers) {
        TaskSchedulerBuilder builder = new TaskSchedulerBuilder();
        builder = builder.poolSize(properties.getPool().getSize());
        builder = builder.threadNamePrefix(properties.getThreadNamePrefix());
        builder = builder.customizers(taskSchedulerCustomizers);
        return builder;
    }

}

代码配置线程池

    // 创建线程
    @Bean
    public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
        ThreadPoolTaskScheduler executor = new ThreadPoolTaskScheduler();
        executor.setPoolSize(20);
        executor.setThreadNamePrefix("taskExecutor-");
        executor.setWaitForTasksToCompleteOnShutdown(true);
        executor.setAwaitTerminationSeconds(60);
        return executor;
    }

我们可以配置线程数量,和线程池前缀信息。

# 线程池大小 
spring.task.scheduling.pool.size=10 
# 线程名前缀 
spring.task.scheduling.thread-name-prefix=task-pool-

2. 整合步骤

  1. 在启动类上加入@EnableScheduling注解。
  2. 在任务方法上加入 @Scheduled注解。

需要主要的是,SpringBoot默认一个工作线程,任务之间可能会互相影响,出现misfire(错过执行)的情况,我们可以根据实际情况调整线程池的大小。

使用方法:

    @Scheduled(fixedRate = 2000)
    public void printLog(){
        log.info("定时打印");
    }

项目启动后,会定时执行该方法。

3. @Scheduled注解的属性

源码:org.springframework.scheduling.annotation.Scheduled

属性 作用
cron cron表达式,按照指定的规则执行
fixedDelay 上一次任务执行完成后多久再次执行,单位ms,类型long
fixedDelayString 同fixedDelay,只不过单位是String
fixedRate 按照一定频率执行任务,若错过本来触发时间,则任务会立即触发
fixedRateString 同fixedRate,单位String类型
initialDelay 表示延迟多久后第一次执行任务,参数类型为long,单位ms
initialDelayString 同initialDelay,单位String类型
zone 时区,默认为当前时区,一般没有用到


 

你可能感兴趣的:(spring,boot)