最近线上出现了一个奇怪的问题,由于业务需要,我们通过定时任务进行定时excel 导入操作,但是常常会出现一些定时任务在某些时间段不执行的问题,由于业务需要,这里的定时任务都设置五分钟执行一次,但是事实并非如此,定时任务并没有五分钟执行一次,甚至间隔几个小时,都不执行一次,刚开始我以为是因为定时任务没有执行完成,不会进行下一次执行
我想到难不成定时任务一次只会执行一个@scheduled标注的方法所以我搜索了, Schedule定时任务同一时刻只执行一个任务,得到了以下答案:spring boot 的@Scheduled定时任务,同一时间段的定时任务只会执行一个,其余的会被阻塞等待_轻尘×的博客-CSDN博客查看源码发现默认线程池中只有一个线程,只能挨个执行,解决方法线程池多加几个线程,启动项类中加入如下配置@Bean public TaskScheduler taskScheduler() { ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler(); taskScheduler.setPoolSize(50);// 自定义线程个数 return taskScheduhttps://blog.csdn.net/leisure_life/article/details/106076440
后来为了查明原因我首先下载了源码后,搜索了Scheduled.class 虽然找到了一些相关的类但是并没有找到定时任务真正执行的位置,所以我再次搜索了“@scheduled 源码分析”,其中有一篇文章,其中有这样一段话:
最终了解到其实真正执行还是线程池在执行,结合上面的文章重新配置了定时任务线程池,解决问题,以下是是实验流程:
创建两个定时任务
我把线程池配置注释掉只要执行到第一个任务就卡住
恢复线程池配置后,第一个任务卡住,第二个任务继续执行了