本文仅作为个人日常记录,如有错误以及不当,敬请指出。
问题:
- 之前在做定时任务时,有这样一个情况。几个定时任务是在同一时间跑,但是在运行过程中发现,当多个任务时只能执行一个任务,其他任务需要等这个任务执行完毕后才能继续执行,所以我们要来解决这个问题&了解为何如此。
先上解决办法:
- 例如: 自定义线程池
@Configuration
public class ScheduledConfig {
@Bean
public ThreadPoolTaskScheduler taskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(10);
return scheduler;
}
}
如果只是要解决办法,看到这里就可以划走了~
原因:
- 点击@EnableScheduling
- EnableScheduling源码的注释译文:
默认情况下,会搜索关联的调度器定义:要么是上下文中唯一的org.springframework.scheduling.TaskScheduler bean,要么是名为“TaskScheduler”的TaskScheduler bean;对java.util.concurrent.ScheduledExecutorService bean也会执行相同的查找。如果两者都不能被解析,本地单线程默认调度器将被创建并在注册器中使用。
-
点击SchedulingConfiguration
-
ScheduledAnnotationBeanPostProcessor中有这样一段代码,可以看到和注释的译文描述一致。如果没有找到需要类型的线程池实例,在这段代码的最后一行有这样一行代码this.registrar.afterPropertiesSet(); 继续看第4步ScheduledTaskRegistrar
(截图太长,所以复制了源码。放心,我没有篡改里面任何一行!)
@Override
public void afterSingletonsInstantiated() {
// Remove resolved singleton classes from cache
this.nonAnnotatedClasses.clear();
if (this.applicationContext == null) {
// Not running in an ApplicationContext -> register tasks early...
finishRegistration();
}
}
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
if (event.