SpringBoot自带ThreadPoolTaskScheduler实现数据库管理定时任务
最近做了一个需求:将定时任务保存到数据库中,并在页面上实现定时任务的开关,以及更新定时任务时间后重新创建定时任务。
于是想到了SpringBoot中自带的ThreadPoolTaskScheduler。
在SpringBoot中提供的ThreadPoolTaskScheduler这个类,该类提供了一个schedule(Runnable task, Trigger trigger)的方法可以实现定时任务的创建,该方法是通过管理线程来实现。
schedule(Runnable task, Trigger trigger)源码:
上述源码中,首先会获取定时任务执行服务,即:ScheduledExecutorService executor = getScheduledExecutor(); ,然后创建重排线程类,并调用schedule() 方法来创建ScheduledFuture<?> 。
在ScheduledFuture<?> 中提供了cancel(boolean mayInterruptIfRunning) 来实现定时任务的删除。通过这两个方法,我们可以实现上述的需求。
废话不多说,代码撸起。
1|01、代码实现
2|01.1 定时任务线程配置
3|01.2 获取类工具
通过ApplicationContext中getBean通过类名来获取对应的类。
4|01.3 创建定时任务线程类
由于ThreadPoolTaskScheduler是基于线程来创建定时任务的,因此我们封装一个类来实现Runnable,其主要作用是获取数据参数,绑定定时任务类及定时任务方法,然后在通过反射拿到方法进行执行。参数则定义成泛型,便于直接传递,定时任务方法获取后不需要再次转换。
5|01.4 封装管理定时任务工具
该工具主要实现定时任务的创建和删除方法,在创建定时任务时要先调用删除方法,确保当前任务是唯一的,因此在更新定时任务时间时,只需要调用创建方法即可。
其中定义了一个 ConcurrentHashMap<String, ScheduledFuture<?>> ,主要作用是为了管理定时任务,通过自定义的任务名称或Id,获取到ScheduledFuture\<?>来进行相关操作,例如:调用关闭方法。
6|02、测试
创建的线程类与工具已经封装完成,接下来我们来进行下测试。
先创建定时任务表:
7|02.1 创建定时任务执行类
简单获取用户信息,进行显示。
8|02.2 创建实现方法
上述代码中ScheduleTaskMapper是继承Mybatis-plus中的BaseMapper实现单表操作,小伙伴们可自行实现。
9|02.3 执行结果
我们创建了三个方法,分别是: addTask,editTask,deleteTask来实现定时任务的删除,添加,具体实现参考上面代码。看看执行结果:
创建定时任务: 提交参数:
taskClazz:对应测试类 @Component(value = "testSchedulingTask")中的value值 taskMethod:测试内中的执行方法。如:TestSchedulingTask中的taskMethod方法 cron:定时任务的cron格式时间
从执行结果动态图可以看到,任务每隔5s种就会获取一次用户信息。
删除定时任务:
删除Id为1000的数据库任务,同时也是删除key为1000的定时任务
任务被删除后,即使过了5s依然没有任务在执行。
总结
ThreadPoolTaskScheduler实现定时任务主要是通过对线程的管理来进行操作,添加任务时即创建一个线程,删除时即将该线程删除。因此在创建定时任务只需要创建线程就可以,在创建线程时,通过反射来获取对应的方法及传递参数。
上述就是使用SprngBoot中的ThreadPoolTaskScheduler来实现定时任务,我们只要使用前端连接相应的接口就可以实现管理人员管理定时任务的功能。
__EOF__

本文链接:https://www.cnblogs.com/caicz/p/17474071.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
2019-06-12 JVM 分析工具和查看命令,超详细
2019-06-12 深入浅出分析MySQL索引设计背后的数据结构
2019-06-12 详解mysql复制机制--异步复制,半同步复制和并行复制
2019-06-12 MySQL优化心得
2019-06-12 Mysql索引原理
2019-06-12 走近kafka-文件存储
2019-06-12 常见的锁机制