@Scheduled定义的调度真的是单线程执行的吗?
查看源码
@ConfigurationProperties("spring.task.scheduling")
public class TaskSchedulingProperties {
private final TaskSchedulingProperties.Pool pool = new TaskSchedulingProperties.Pool();
...
...
public static class Pool {
private int size = 1;
public Pool() {
}
public int getSize() {
return this.size;
}
public void setSize(int size) {
this.size = size;
}
}
}
由此可见spring提供的调度器是默认采用单线程的线程池
。
这样会导致如果一个定时任务发生阻塞,将会影响其他定时任务的执行,因此我们需要配置多线程执行来解决此问题。
多线程解决方案
Spring Boot工程
application.properties中添加如下配置即可
spring.task.scheduling.pool.size=10
spring.task.scheduling.thread-name-prefix=schedule-test
Spring工程
添加java配置即可
/**
* 配置spring定时任务多线程执行默认单线程
* 两个方法只需配置一个即可
* springboot还可以通过配置文件配置
*/
@Configuration
public class SchedulerConfig {
// 方法1 配置TaskScheduler
@Bean
public ThreadPoolTaskScheduler taskScheduler() {
ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.setPoolSize(10);
threadPoolTaskScheduler.setRemoveOnCancelPolicy(true);
threadPoolTaskScheduler.setThreadNamePrefix("schedule-pool-");
threadPoolTaskScheduler.setWaitForTasksToCompleteOnShutdown(true);
return threadPoolTaskScheduler;
}
// 方法2 配置定时任务线程池
@Bean
public ScheduledExecutorService scheduledExecutorService() {
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(10);
return scheduledExecutorService;
}
}