前言
由于工作 ETL 工具需要一个定时任务调度系统,鉴于本人以前只开发过简单的定时任务,并且都是在配置文件配置好的,而本次需要一个可前端维护、需要失败重试等灵活的定时任务调度,于是查询了好多资料、求助了社区的各位大佬后关于调度任务的问,基本有了一点思路,按照自己的思路进行了简单的实践,现将实践结果分享出来。
技术选型
- Springboot
- Quartz
- spring-data-jpa
- mysql 数据库
本次实践是为了给工作内容先出个 demo,所以选取了开发速度较快的 Spring Boot 框架
开始行动
配置
初始化任务
初始化任务在在项目启动的时候,通过查询数据库配置好的任务,然后添加到任务队列中的方式来实现的,具体代码如下:
@PostConstruct
public void init(){
logger.info("--------初始化定时任务----------");
List<JobEntity> jobEntities = jobDao.findAll();
logger.info("---------正在初始化"+jobEntities.size()+"个定时任务-----------");
jobEntities.forEach(jobEntity -> {
//初始化定时任务,如果已经在quartz中,则不重复初始化,如果不在quartz,则进行初始化
CronTrigger cronTrigger = Jobutils.getCronTrigger(scheduler,jobEntity.getId());
if (cronTrigger == null){
logger.info("初始化任务ID:" + jobEntity.getId());
Jobutils.createScheduleJob(scheduler,jobEntity);
}
});
logger.info("----------定时任务初始化成功----------");
}
失败重试
业务需要在任务中配置失败是否重试、重试次数、重试间隔,然后在任务执行失败时进行重试,知道成功或者 重试次数耗尽,则本周期任务结束。
重试是在失败以后进行的,代码如下:在失败以后判断重试次数等,然后重新添加新任务。
如果已经触发任务、但是数据删除了本条任务
在本 demo 里面的解决方法是,在执行的时候,会先从数据库查询是否存在这条任务,不存在则不执行,并且从 quartz 中移除该任务。
当然,还有其他的方式,没有一一实现,有兴趣的朋友可以自己改改代码。
写在最后
就目前为止,本 demo 还是有很多的问题,由于需要马上开展工作,具体问题我在工作代码中去解决,这里以后如果有空,我会再完善大概率就这样了,
关于管理页面,我写了后台接口,但是页面只写了查询任务列表和 日志列表的,最近比较忙,懒得去写了
代码
demo 代码 已经放到 Github, 有兴趣的可以去看看。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于