SpringBoot-Scheduled定时任务调度
说明
- 启动类添加注解
@EnableScheduling
,任务方法添加注解@Scheduled
,共同配合实现定时任务 - 定时任务的线程池默认大小为 1,也就是单线程执行,这个
poolSize
在ThreadPoolTaskScheduler.java
中定义 - 如果有多个定时任务,默认为串行执行。要实现并发执行,则必须修改线程池大小。
方式一:配置线程池大小(推荐)
- application.yml 中配置
1
2
3
4
5
6spring:
task:
scheduling:
pool:
size: 20 # 配置线程池大小,默认为 1,单线程
thread-name-prefix: Job-Thread-- 或者通过代码配置
1
2
3
4
5
6
7
public class SchedulerConfig implements SchedulingConfigurer {
public void configureTasks(ScheduledTaskRegistrar registrar) {
registrar.setScheduler(Executors.newScheduledThreadPool(10)); // 10线程池
}
}方式二:结合 @Async 实现异步执行
为任务添加
@Async
注解,使同一任务的不同实例也能并行执行。需先配置异步线程池:配置类方式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class AsyncConfig {
public ThreadPoolTaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10); // 核心线程数
executor.setMaxPoolSize(50); // 最大线程数
executor.setQueueCapacity(100); // 队列容量
executor.setThreadNamePrefix("Async-");
executor.initialize();
return executor;
}
}配置文件方式
1
2
3
4spring.task.execution.pool.core-size=10
spring.task.execution.pool.max-size=50
spring.task.execution.pool.queue-capacity=100
spring.task.execution.thread-name-prefix=Async-
示例
添加注解 @Scheduled
1 | /** |
参考文档
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 王文哲的博客!