暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SchedulingConfigurer-持久化基于接口的定时任务

匠工精神 2021-01-02
693

想都是问题,做才是答案。


做还有成功的机会,而不做,却是一点机会也没有。先行动起来,纵然华丽的跌倒,也胜过无谓的徘徊。只有先去做了之后,才能知道问题所在,才能真正解决问题。


新的一年里,祝大家拼出积极,搏出努力,好运伴随,幸福跟随,成就自己,成功公司。


今天给大家分享一个编程小技巧,相信大家都用过定时任务来处理一些业务逻辑,在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. 最终其实在线程池中对任务进行分配处理:


以上对定时任务的流程源码做了简单跟踪分析,有兴趣的实践下。


总结


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

长按关注,欢迎一起探讨技术

文章转载自匠工精神,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论