前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >注解 @Scheduled 的执行原理

注解 @Scheduled 的执行原理

作者头像
哲洛不闹
发布2020-04-21 15:57:05
1.1K0
发布2020-04-21 15:57:05
举报
文章被收录于专栏:java一日一条

1、加载使用 @Scheduled 注解的类及方法

Spring 首先会通过类 ScheduledAnnotationBeanPostProcessor 的 postProcessAfterInitialization 方法去初始化 bean,待初始化完 bean 后,就会拦截所有用到“@Scheduled”注解的方法,进行调度处理,具体细节请看下面代码:

2、解析 @Scheduled 的内容,并将定时任务注册到 ScheduledTaskRegistrar 中

解析相应的的注解参数,放入“定时任务列表”等待后续处理;之后在“定时任务列表”中统一执行相应的定时任务(定时任务先执行 corn,判断定时任务的执行时间,计算出相应的下次执行时间,放入线程中,到了时间就执行。再执行按“频率”(fixedRate)执行的定时任务,直到所有任务执行结束)。

3、执行定时任务

run 方法是调度 task 的核心,task 的执行实际上是 run 方法的执行。

下方图片显示的是定时任务执行时的参数,请注意 pool size = 1,active threads = 1(线程池中只会有一个生效的线程), queued tasks(所有的定时任务存在于队列中)。

总结

从上面代码可以看出,如果多个定时任务定义的是同一个时间,会根据程序加载标有 @Scheduled 方法的先后来执行。若某个定时任务一直无法执行完成,则无法设置下次任务执行时间,之后会导致此任务后面的所有定时任务无法继续执行,也就会出现所有的定时任务罢工的现象。所以应用 SpringBoot 的定时任务的方法中,一定不要出现“死循环”、“执行耗费大量时间”、“http持续等待无响应”的现象,否则会导致定时任务直接罢工。针对数据量、查询或者远程调用特别多的场景,推荐把定时任务分段处理。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java一日一条 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档