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<TaskSchedulerCustomizer> 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. 整合步骤
- 在启动类上加入@EnableScheduling注解。
- 在任务方法上加入 @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 | 时区,默认为当前时区,一般没有用到 |