想都是问题,做才是答案。
做还有成功的机会,而不做,却是一点机会也没有。先行动起来,纵然华丽的跌倒,也胜过无谓的徘徊。只有先去做了之后,才能知道问题所在,才能真正解决问题。
新的一年里,祝大家拼出积极,搏出努力,好运伴随,幸福跟随,成就自己,成功公司。
今天给大家分享一个编程小技巧,相信大家都用过定时任务来处理一些业务逻辑,在springboot项目中应用的最多的应该是基于注解@Scheduled,这种方式创建定时任务非常简单,只需几行代码便可完成。但缺点是当我们调整了执行周期的时候,需要重启应用才能生效,这多少有些不方便。为了达到实时生效的效果,我们可以使用接口来完成定时任务,这也是本次分享的内容。(在我们内部的实际项目中,我们是自己封装了一套持久化的定时任务组件)接下来就分享下如何持久化定时任务:
在数据库中设计好表结构

字段说明:
cron:cron表达式;
bean:需要执行方法所在spring 容器中的bean名称;
method:执行的方法;
enable:是否开启;
创建定时器
数据库准备好数据之后,我们编写定时任务,注意这里添加的是TriggerTask,目的是循环读取我们在数据库设置好的执行周期,以及执行相关定时任务的内容。相关代码如下:

原理说明:
借助spring提供的接口SchedulingConfigurer,把需要执行的定时任务注入到spring容器中,在需要调用的时候取出来,通过反射调用需要执行的方法。
spring 内部流程:
1. 通过注解引入:

2. new了一个
ScheduledAnnotationBeanPostProcessor

3. 实际上是new了一个
ScheduledTaskRegistrar
4. 在
ScheduledAnnotationBeanPostProcessor
完成初始化时,寻找基于
SchedulingConfigurer
接口的bean

5. 最后调用了
ScheduledTaskRegistrar的
afterPropertiesSet方法

6. 继续到
ScheduledTaskRegistrar
类里,把triggerTasks转换成scheduleTasks

7. 最终其实在线程池中对任务进行分配处理:

以上对定时任务的流程源码做了简单跟踪分析,有兴趣的实践下。
总结
今天主要跟大家分享了我们工作中常用到的一个编程技巧,把定时任务配置在数据库中,方便我们动态的去调整。最后也带大家简单分析了源码流程,让我们知其所以然。最后,再次送上祝福:新的一年里,祝大家拼出积极,搏出努力,好运伴随,幸福跟随,成就自己,成功公司。
长按关注,欢迎一起探讨技术





