SpringBoot 结合 Quartz 的数据库定时任务

本贴最后更新于 2004 天前,其中的信息可能已经时移世改

前言

由于工作 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, 有兴趣的可以去看看。

https://github.com/gitors/jobdemo

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3190 引用 • 8214 回帖 • 1 关注
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    943 引用 • 1460 回帖 • 3 关注
  • Quartz
    19 引用 • 16 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...