简单好用SmartJob
前言
定时任务是软件开发中的一项基本需求,几乎贯穿于每位开发者的职业生涯,
无论是定时发送通知、安排内容发布,还是周期性地执行特定业务逻辑,这些场景都要求能够管理控制、监控任务。
方案 | 优点 | 缺点 |
---|---|---|
Spring 自带 | 1、集成简单,直接在Spring Boot应用中使用,无需额外依赖。 | 1、任务管理功能有限,如动态添加或修改任务较麻烦,缺少监控等。 |
Quartz | 1、功能强大,支持复杂的调度需求,如任务持久化、集群部署、分布式调度。 | 1、配置和使用相对复杂,集成Spring需要更多配置。 |
Elastic-Job | 1、专为分布式环境设计,支持任务分片、弹性扩缩容。 | 1、需要额外的部署和配置工作。 |
xxl-job | 1、轻量级分布式任务调度平台,易用性强。 | 1、社区和文档相对于Quartz可能较小。 |
可以看出没有完美的方案,易用、全面、简单这三项几乎是一个不可能三角。
上手简单,如Spring,功能相对基础,全靠自己改造。
而功能全面,如Quartz、xxl-job 等,又面临配置部署复杂,大材小用,杀鸡用牛刀的窘境。
既然完美方案不可能存在,何不聚焦于核心需求,有所取舍,
开发一套上手简单,功能够用,让开发者专注于业务实现,适合中小型团队绝大多数需求场景的任务执行方案呢,这就是 SmartJob 的开发初衷。
SmartJob 核心理念:简单、好用、够用
简单:轻量级的功能,极简的配置
好用:易上手,易编码,易拓展
够用:功能实用,界面友好,让管理任务变得直观便捷
深知,一个团队一个人的能力和精力都是有限的,
因此,SmartJob选择拥抱简单,虽在一定程度上牺牲了功能的全面性,
但这也是的理念,既然不可能完美,就向简单、好用、够用的方向踏实坚定前行。
功能特点
- 基于 Spring 的任务调度,实现高效的任务调度管理,无需额外依赖。
- 支持 cron 表达式,支持固定间隔执行。例如:每天10:15发送报表邮件,每隔100秒执行一次
- 支持灵活的定时任务参数。 例如:有时候需要定时任务按设置的参数执行调试
- 在分布式环境下,无需额外处理,调度机制能确保任务在多服务、多实例间无缝运行,且不会出现任务重复。
- 支持动态修改、开启/暂停、执行、查看执行记录等功能,这也是大多数的场景需求。
- 提供了直观的前端界面,让您能够更清晰地查看和管理定时任务。
- 如果您倾向于直接操作数据库,也支持直接修改数据库配置,配置变动将自动生效,更加便利灵活。
前端管理页面-演示
任务列表
配置任务
立即执行
查询任务执行记录
使用指南
一、开启 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⬇️
/**
* 定时任务 示例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⬇️
/**
* 定时任务 示例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 中
3、启动服务,即可看到 SmartJob 配置信息
任务状态 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或者有宝贵的建议和反馈,请随时与联系方式,您的支持是不断前行的最大动力!
联系我们
- 教育领域(高职院校数字化、就业创业大数据平台、继续教育平台;在线教育系统、视频直播、题库等,包含:医学、应急管理、成考、专升本等)
- 供应链领域(网络货运平台、大宗贸易进销存ERP、物流管理TMS、B2B电商、仓储WMS、AI提效等)
- 中医领域(诊所数字化管理、互联网医院、AI辅助诊疗、中医适宜技术、在线云问诊、空中药房等)
- AI+软件领域(软件定制外包、开源技术、数据大屏、国产化改造、技术升级换代、人员外包、技术顾问、技术培训等)
加微信: 卓大 拉你入群,一起学习 | 公众号 :六边形工程师 分享:赚钱、代码、生活 | 请 “1024创新实验室” 烩面里加肉 咖啡配胡辣汤,提神又饱腹 | 抖音 : 六边形工程师 直播:赚钱、代码、中医 |