在spring boot项目中,可以通过@EnableScheduling注解和@Scheduled注解实现定时任务,也可以通过SchedulingConfigurer接口来实现定时任务。但是这两种方式不能动态添加、删除、启动、停止任务。要实现动态增删启停定时任务功能,比较广泛的做法是集成Quartz框架。但是本人的开发原则是:在满足项目需求的情况下,尽量少的依赖其它框架,避免项目过于臃肿和复杂。查看spring-context这个jar包中org.springframework.scheduling.ScheduledTaskRegistrar这个类的源代码,发现可以通过改造这个类就能实现动态增删启停定时任务功能。
添加执行定时任务的线程池配置类
1 |
|
添加ScheduledFuture的包装类。ScheduledFuture是ScheduledExecutorService定时任务线程池的执行结果。
1 | public final class ScheduledTask { |
添加Runnable接口实现类,被定时任务线程池调用,用来执行指定bean里面的方法。
1 | public class SchedulingRunnable implements Runnable { |
添加定时任务注册类,用来增加、删除定时任务。
1 |
|
添加定时任务示例类
1 | @Component("demoTask") |
定时任务数据库表设计
添加定时任务实体类
1 | public class SysJobPO { |
新增定时任务
1 | boolean success = sysJobRepository.addSysJob(sysJob); |
修改定时任务,先移除原来的任务,再启动新任务
1 | boolean success = sysJobRepository.editSysJob(sysJob); |
删除定时任务
1 | boolean success = sysJobRepository.deleteSysJobById(req.getJobId()); |
定时任务启动/停止状态切换
1 | if (existedSysJob.getJobStatus().equals(SysJobStatus.NORMAL.ordinal())) { |
添加实现了CommandLineRunner接口的SysJobRunner类,当spring boot项目启动完成后,加载数据库里状态为正常的定时任务。
1 |
|
工具类SpringContextUtils,用来从spring容器里获取bean
1 |
|
参考文章:
参考链接