
定时任务
大约 3 分钟
1. 核心功能
- 定时任务管理:支持通过Cron表达式定义任务执行周期,支持任务的新增、编辑、删除、手动执行等操作。
- 任务类型:目前支持两种任务类型:
geturl
:定时请求指定URL。invokefunction
:定时调用指定函数(需传入函数名和参数)。
- 自动调度:系统会定期检查到期任务并自动执行,同时更新任务的下次执行时间。
- 持久化存储:任务配置存储在数据库的
sys_job
表中,支持动态更新配置。
2. 技术实现
核心数据结构
PeriodicJob
(定期任务):定义在src/worker/common/periodic.rs
,用于描述定时任务的核心信息,包括:name
:任务名称class
:任务处理器类名(用于关联执行逻辑)cron
:Cron表达式(定义执行周期)queue
:任务队列名称args
:任务参数(JSON格式)- 其他属性:重试配置、下次执行时间等。
Job
(可执行任务):定义在src/worker/common/job.rs
,是PeriodicJob
转换后的可执行单元,包含队列、参数、执行状态等信息。
任务调度机制
任务存储:
- 定期任务通过Redis的有序集合(
periodic
键)存储,以“下次执行时间”为分数排序。 - 待执行的定时任务(非周期性)存储在
schedule
和retry
有序集合中。
- 定期任务通过Redis的有序集合(
调度逻辑:
- 系统启动后,
Processor
(src/worker/common/processor.rs
)会启动两个定时检查任务:- 每5秒检查
schedule
和retry
集合,将到期任务(当前时间 ≥ 任务执行时间)加入执行队列。 - 每30秒检查
periodic
集合,将到期的定期任务执行后,计算下次执行时间并更新回periodic
集合。
- 每5秒检查
- 系统启动后,
任务管理与执行流程
任务配置管理:
- 数据库表
sys_job
(定义在qiluo.sql
)存储任务配置,包括任务ID、类型、Cron表达式、参数、状态等。 - 通过
src/model/sys/model/msys_job.rs
中的方法(add
/edit
/delete
等)操作数据库,管理任务配置。
- 数据库表
任务加载与更新:
update_job
函数(src/service/sys/s_sys_job.rs
)会清除现有定期任务,并从数据库加载所有启用状态(status = 0
)的任务,重新注册到Redis。- 注册逻辑通过
periodic_worker
函数(src/worker/periodic_manager.rs
)实现,将任务转换为PeriodicJob
并存储到Redis的periodic
集合。
任务执行:
- 当任务到期时,系统将
PeriodicJob
转换为Job
,并通过对应的处理器(如RequestUrlWorker
处理geturl
任务,InvokeFunctionWorker
处理invokefunction
任务)执行具体逻辑。 - 执行完成后,更新数据库中任务的
run_count
(已执行次数)。
- 当任务到期时,系统将
3. 关键代码模块
模块路径 | 功能 |
---|---|
src/worker/common/periodic.rs | 定义PeriodicJob 结构及Cron解析、下次执行时间计算等核心逻辑。 |
src/worker/common/scheduled.rs | 实现定时任务的入队逻辑(从Redis读取到期任务并执行)。 |
src/worker/common/processor.rs | 启动调度器,定期检查并触发任务执行。 |
src/service/sys/s_sys_job.rs | 提供任务管理API(增删改查、执行、验证Cron表达式等)。 |
src/model/sys/entity/sys_job.rs | 数据库表sys_job 的ORM映射。 |
4. 示例任务
数据库初始化数据(qiluo.sql
)中包含两个示例定时任务:
- 每30秒请求百度(
https://www.baidu.com/
)。 - 每30秒请求QQ(
https://www.qq.com/
)。
综上,该仓库的定时任务系统通过Rust异步 runtime(Tokio)、Redis缓存和Cron表达式实现了高效、可靠的周期性任务调度,支持动态配置和多种任务类型,适用于企业级应用的自动化场景。