1024创新实验室-公告

助力抖音1000个粉丝,开播写代码🎉🎉

打开【抖音APP】-点击【左上角侧边栏】-【点击扫一扫】-【进行关注】🎉🎉

和1024创新实验室一起,热爱代码,热爱生活,永远年轻,永远前行🎉🎉


Skip to content

简单好用SmartJob

前言

定时任务是软件开发中的一项基本需求,几乎贯穿于每位开发者的职业生涯,

无论是定时发送通知、安排内容发布,还是周期性地执行特定业务逻辑,这些场景都要求能够管理控制、监控任务。

方案优点缺点
Spring 自带1、集成简单,直接在Spring Boot应用中使用,无需额外依赖。1、任务管理功能有限,如动态添加或修改任务较麻烦,缺少监控等。
Quartz1、功能强大,支持复杂的调度需求,如任务持久化、集群部署、分布式调度。1、配置和使用相对复杂,集成Spring需要更多配置。
Elastic-Job1、专为分布式环境设计,支持任务分片、弹性扩缩容。1、需要额外的部署和配置工作。
xxl-job1、轻量级分布式任务调度平台,易用性强。1、社区和文档相对于Quartz可能较小。

可以看出没有完美的方案,易用、全面、简单这三项几乎是一个不可能三角。

上手简单,如Spring,功能相对基础,全靠自己改造。

而功能全面,如Quartz、xxl-job 等,又面临配置部署复杂,大材小用,杀鸡用牛刀的窘境。


既然完美方案不可能存在,何不聚焦于核心需求,有所取舍,

开发一套上手简单,功能够用,让开发者专注于业务实现,适合中小型团队绝大多数需求场景的任务执行方案呢,这就是 SmartJob 的开发初衷。



SmartJob 核心理念:简单、好用、够用

简单:轻量级的功能,极简的配置

好用:易上手,易编码,易拓展

够用:功能实用,界面友好,让管理任务变得直观便捷


深知,一个团队一个人的能力和精力都是有限的,

因此,SmartJob选择拥抱简单,虽在一定程度上牺牲了功能的全面性,

但这也是的理念,既然不可能完美,就向简单、好用、够用的方向踏实坚定前行。

功能特点

  1. 基于 Spring 的任务调度,实现高效的任务调度管理,无需额外依赖。
  2. 支持 cron 表达式,支持固定间隔执行。例如:每天10:15发送报表邮件,每隔100秒执行一次
  3. 支持灵活的定时任务参数。 例如:有时候需要定时任务按设置的参数执行调试
  4. 在分布式环境下,无需额外处理,调度机制能确保任务在多服务、多实例间无缝运行,且不会出现任务重复。
  5. 支持动态修改、开启/暂停、执行、查看执行记录等功能,这也是大多数的场景需求。
  6. 提供了直观的前端界面,让您能够更清晰地查看和管理定时任务。
  7. 如果您倾向于直接操作数据库,也支持直接修改数据库配置,配置变动将自动生效,更加便利灵活。

前端管理页面-演示

任务列表

0

配置任务

0

0

立即执行

0

查询任务执行记录

0



使用指南


一、开启 SmartJob 定时任务管理模块

只需一行,即可开启

【properties】⬇️

    smart.job.enabled=true

【yaml】⬇️

    smart: 
      job: 
        enabled: true

完整配置,参考注释按需配置。

【properties】 ⬇️

    # smart job 开关
    smart.job.enabled=true 
      
    # 任务初始化延迟 默认30秒 可选
    smart.job.init-delay: 30
     
    # 定时任务执行线程池数量偶数 默认2 可选
    smart.job.core-pool-size: 2
     
    # 数据库配置检测-开关 默认开启可选(作用是固定间隔读取数据库配置更新配置,关闭后只能重启服务或通过接口修改定时任务,建议开启) 
    smart.job.db-refresh-enabled: true
     
    # 数据库配置检测-执行间隔 默认120秒 可选(smart.job.db-refresh-enabled 开启状态下此项才有意义和作用) 
    smart.job.db-refresh-interval: 120

【yaml】⬇️

    smart: 
      job: 
        enabled: true
        core-pool-size: 2 
        db-refresh-enabled: true 
        db-refresh-interval: 60

二、编写/添加定时任务


1、实现接口 SmartJob

业务逻辑写在run()方法内,可参考 net.lab1024.sa.base.module.support.job.sample 下示例类。

示例、SmartJobSample1⬇️
java
    /**
     * 定时任务 示例1
     *
     * @author huke
     * @date 2024/6/17 21:30
     */
    @Slf4j
    @Service
    public class SmartJobSample1 implements SmartJob {
        /**
         * 定时任务示例
         *
         * @param param 可选参数 任务不需要时不用管
         * @return
         */
        @Override
        public String run(String param) {
            // 写点什么业务逻辑
            return "执行完毕,随便说点什么吧";
        }
    }
示例2、SmartJobSample2⬇️
java
    /**
     * 定时任务 示例2
     *
     * @author huke
     * @date 2024/6/17 21:30
     */
    @Slf4j
    @Service
    public class SmartJobSample2 implements SmartJob {
    
        @Autowired
        private ConfigDao configDao;
    
        /**
         * 定时任务示例
         * 需要事务时 添加 @Transactional 注解
         *
         * @param param 可选参数 任务不需要时不用管
         * @return
         */
        @Transactional(rollbackFor = Throwable.class)
        @Override
        public String run(String param) {
            // 随便更新点什么东西
            ConfigEntity configEntity = new ConfigEntity();
            configEntity.setConfigId(1L);
            configEntity.setRemark(param);
            configDao.updateById(configEntity);
    
            configEntity = new ConfigEntity();
            configEntity.setConfigId(2L);
            configEntity.setRemark("SmartJob Sample2 update");
            configDao.updateById(configEntity);
    
            return "执行成功,本次处理数据1条";
        }
    
    }

2、数据库配置定时任务


在数据表 b_smart_job 中新增一条对应的任务配置,主要参数如下

job_name:任务名称

job_class:任务实现类,注意需要与代码匹配

trigger_type:触发类型 cron表达式 或 固定间隔(秒),存储在字段 trigger_value 中

0


3、启动服务,即可看到 SmartJob 配置信息

0

任务状态 enabled_flag 设置为1开启时,会在预定时间执行任务,同时输出执行日志,b_smart_job_log 也可看到执行记录。

[2024-06-24 22:10:11,270][INFO ][SmartJobExecutor-0] ==== SmartJob ==== execute job->示例任务1,time-millis->0ms



核心原理

1、SmartJobScheduler - 任务调度

基于Spring框架的ThreadPoolTaskScheduler。

ThreadPoolTaskScheduler作为Spring提供的强大线程池任务调度器,为SmartJob提供了底层的多线程调度支持。确保每个任务能够按照预设的时间准确无误地执行。

2、SmartJobLauncher - 初始化/管理配置、定时任务

在系统启动阶段,负责初始化延迟时间,线程数量等关键参数,以及初始化所有的定时任务,将它们加入到任务调度器中。

同时还承担着检测数据库配置变动的重任。通过启动一个独立的线程,周期性地检查数据库中的任务配置信息,一旦发现配置有所变动(如启动/暂停,修改任务参数等),便能够立即作出响应,更新任务调度器中的任务配置,确保系统始终按照最新的配置运行。 这种机制确保SmartJob在无需接口及前端管理界面时,同样正常运作,提高了 SmartJob 的适应性和动态调整能力。

3、SmartJobExecutor - 任务执行

作为任务执行的核心组件,SmartJobExecutor承载着任务执行前后的各项关键逻辑。

在执行任务之前,SmartJobExecutor会先获取任务配置信息,并根据需要获取分布式锁,以确保在分布式环境下任务执行的唯一性和一致性。

在任务执行过程中,SmartJobExecutor会调用用户定义的执行逻辑,并处理可能出现的异常情况。

任务执行完毕后,SmartJobExecutor还会负责保存任务执行记录,包括执行时间、执行参数、执行结果等关键信息,以便后续查询和审计。

4、分布式应用调度 - Redis的订阅消息

SmartJob采用了Redis的发布/订阅功能,支持分布式环境下多应用实例间的任务调度管理,不同应用实例间,可以相互通信,共享任务执行的状态和结果。提高任务执行的可靠性,还降低了分布式系统间的耦合度,使系统更加易于扩展和维护。



常见问题

Q:单服务、多服务/多实例 场景下,需要怎么处理?

什么都不需要做,在处理单服务、多服务/多实例场景时,

当前的任务执行机制已设计为:无论任务在多少个服务中运行,同一时间仅触发一次执行,确保避免任何重复操作。同

时,对任务配置的任何更新都会实时同步至所有运行中的实例,保证数据一致性和准确性。


Q:触发类型 cron 表达式 和 fixedDelay 的选择

适合就行,关键在于业务场景

cron 表达式确保任务在预设的准确时间执行, 例如:每天9点消息推送通知、每天凌晨3点10分生成统计报表 等等

fixedDelay 侧重于任务执行的频率,不特定于某一时间点。例如:每隔100秒清理下缓存、每隔200秒同步下数据 等等

需要注意的是,fixedDelay的首次执行取决于服务启动时间,且后续执行间隔固定,可能导致多实例中定时任务执行时间不同步。


Q:为什么没有添加、删除定时任务的接口

添加/删除定时任务只涉及数据库变动,实际的任务逻辑代码仍需开发者自行编写或移除。

考虑到SmartJob面对的是开发者,不如直接操作数据库添加或删除定时任务更为便捷灵活。


Q:想要的功能或者场景无法满足怎么办

受限于需求的优先级、紧急程度时间等因素,诸如:告警通知、失败重试、分片执行等等功能,需要等后续更新计划。

欢迎各位开发同志们的宝贵意见和批评指导,您的建议对至关重要。


结尾:

最后,衷心的希望的努力能够助力您的项目开发,解决问题,提高效率。

如果您在使用过程中遇到任何问题、BUG或者有宝贵的建议和反馈,请随时与联系方式,您的支持是不断前行的最大动力!


联系我们

1024创新实验室-主任:卓大,混迹于各个技术圈,研究过计算机,熟悉点 java,略懂点前端。
1024创新实验室 致力于成为中原领先、国内一流的技术团队, 以AI+数字化为驱动,用技术为产业互联网提供无限可能, 业务如下:
  • 教育领域(高职院校数字化、就业创业大数据平台、继续教育平台;在线教育系统、视频直播、题库等,包含:医学、应急管理、成考、专升本等)
  • 供应链领域(网络货运平台、大宗贸易进销存ERP、物流管理TMS、B2B电商、仓储WMS、AI提效等)
  • 中医领域(诊所数字化管理、互联网医院、AI辅助诊疗、中医适宜技术、在线云问诊、空中药房等)
  • AI+软件领域(软件定制外包、开源技术、数据大屏、国产化改造、技术升级换代、人员外包、技术顾问、技术培训等)
加微信: 卓大
拉你入群,一起学习
公众号 :六边形工程师
分享:赚钱、代码、生活
请 “1024创新实验室”
烩面里加肉
咖啡配胡辣汤,提神又饱腹
抖音 : 六边形工程师
直播:赚钱、代码、中医