环境:SpringBoot3.2.5
1. 简介
在Spring Boot中,使用@Scheduled注解可以方便地创建定时任务。然而,随着应用程序的复杂性和运维需求的增加,动态管理这些定时任务成为了一个重要的问题。针对这种动态管理定时任务Spring Boot中并没有提供相应的实现,所以就需要我们自己动手来实现定时任务的管理。
2. 执行原理
首先,我们要搞清楚Spring Boot定时任务的执行原理,其核心先通过ScheduledAnnotationBeanPostProcessor处理器,找到所有的Bean中使用了@Scheduled注解的方法,然后将对应的方法包装到Runnable中。
接下来,就是通过TaskScheduler来执行定时任务,该接口提供了一些列的方法:
在默认情况下,Spring Boot定时任务的执行线程池使用的是ThreadPoolTaskSchedulerBean。内部真正任务调用是通过ScheduledExecutorService执行定时任务。
所以,要实现动态管理任务,就需要记录下每个任务信息。记录任务信息是为了停止任务及再次启动任务,在上面的调度方法都返回了Future对象,可以通过该Future对象来终止任务,可以通过再次调用schedule方法来再次启动任务。所以,我们需要自定义TaskScheduler,在自定义的实现中我们就能很方便的记录管理每个定时任务。
3. 实战案例
要管理任务,我们就必须为每个任务提供一个有意义的名称。@Scheduled注解并没有提供此功能。所以这块功能,需要自己实现。
3.1 自定义@Task注解
该注解用来对任务的说明。
3.2 任务信息TaskInfo
该类用来在执行任务前记录当前的信息,以便可以对任务进行停止和重启。
3.3 自定义线程池
该类的核心作用就2个:1. 重写任务调度方法,记录任务信息2. 添加停止/重启任务调度也可以考虑在该类中实现任务的持久化。
以上就完成了所有的核心操作。接下来写2个方法进行测试。
3.4 测试
定时任务
停止/重启接口
分别调用上面2个方法可以对具体的任务进行停止及重启。