今天一起从一个小bug来看下, Spring定时任务是如何处理的.
一次非预期任务
预定义的任务很简单, 每隔1s执行一次....下面就一起看看Spring是如何管理定时任务的, 为什么加个配置就解决了.
Spring定时任务
从定时任务注解@EnableScheduling入手, 看下spring启动时都做了什么....如果Spring不能从SchedulingConfigurer配置中初始化线程池, 那Spring会尝试从全局范围内查找一个线程池的Bean实例, 但很遗憾, 在我的服务中并没有预定义的线程池.
private...我们的问题就是Spring自己创建的线程池不能提供足够的线程, 导致多个任务不能并行执行, 各task任务互相影响.
protected void scheduleTasks() {
if (this.taskScheduler...可参考下面的时序图理解
初始化:
定时任务启动:
定时任务线程池的初始化为3种, 上面代码流程中都有详解, 这里再汇总下,
SchedulingConfigurer自定义配置
Spring从全局中寻找的线程池实例