SkeyeVSS开发笔记-定时任务数据模型
定时任务数据模型(core/repositories/models/crontab)
本文说明Cron 服务侧「可配置定时项」core/repositories/models/crontab的职责:表结构、uniqueId主键语义、执行参数与logs累积策略,以及与db / cron双端的衔接。
项目地址https://github.com/openskeye/go-vss
姊妹篇:录像计划等业务常与本表video-project条目联动,可结合 4.1 FetchDataLogic-统一定时数据获取 与 cron 内VideoProjectLogic。
1. 在项目中承担的作用
该模型描述一条定时任务配置(周期、批次、超时、是否阻塞、运行日志等):数据落在表sk-crontab。业务主键为字符串uniqueId(非自增数字 id)。初始化时initTableRecords会Insert(crontab.InitRecords)写入内置任务(如video-project录像计划),并DeleteBy清理不在UniqueIds白名单内的记录,避免脏数据残留。Cron 进程通过ConfigService拉取列表,按uniqueId调度VideoProjectLogic等实现。
| 层级 | 作用 |
|---|---|
| 数据层 | AutoMigrate(new(crontab.Crontab));启动前对索引Crontab_uniqueId有Drop + Migrate逻辑(见init_database.go)。 |
| RPC / db 服务 | core/app/sev/db/internal/logic/configservice/crontab_*.go:列表、单行、创建、更新、删除、crontab_bulk_update_logic(按uniqueId批量更新logs等)。 |
| HTTP / backend | core/app/sev/backend/internal/handler/config/crontab:/crontab、/crontab/list等。 |
| Cron | core/app/sev/cron/internal/logic/fetch-data/crontab.go拉取配置;internal/logic/crontab/video-project.go等绑定UniqueIdVideoProject。 |
UseCache()返回nil,不启用模型级内存缓存。
2. 表与字段:数据库列 ↔ Go ↔ JSON
实体Crontab映射表sk-crontab。注意:表无自增id,主键列为uniqueId。
| 字段 | 含义 | 说明 |
|---|---|---|
uniqueId | 业务唯一键 | CHAR(40),唯一索引;ORM 主键字段。内置video-project(录像计划)。 |
title | 标题 | 展示用。 |
interval | 执行周期 | 秒 单位/s。 |
status | 启用状态 | 默认1启用(与其它模型state命名不同,以字段status为准)。 |
readonly | 是否只读 | 1只读,防止后台误改内置项(与初始化数据一致)。 |
timeout | 单批超时 | 秒。 |
counter | 每周期批大小 | 每个周期每一批次执行数量;内置录像计划示例为40。 |
blockStatus | 是否阻塞下一周期 | 1:须等本周期所有批次完成再进入下一周期;0:可不等待。 |
logs | 运行日志 | 库内 JSON字符串数组;Item.Logs为[]string;保留约100 条(具体截断在更新逻辑中实现)。 |
createdAt | 创建时间 | 毫秒时间戳。 |
updatedAt | 更新时间 | 毫秒时间戳;Correction/CorrectionMap刷新。 |
3.Item与Crontab的字段对应
- 内嵌
*Crontab:与实体 JSON 一致。 Logs:仅挂载在Item上,API 为字符串切片;ConvToModel写入Crontab.Logs字符串。UseDBCache:json:"-"。
crontab_update_logic等对logs有条数裁剪(与 RPC 入参结合),避免无限增长,联调时注意观察返回的logs长度。
4. 列名常量(variables.go)
| 常量 | 数据库列 |
|---|---|
ColumnUniqueId | uniqueId |
ColumnTitle | title |
ColumnInterval | interval |
ColumnCounter | counter |
ColumnBlockStatus | blockStatus |
ColumnStatus | status |
ColumnTimeout | timeout |
ColumnLogs | logs |
ColumnReadonly | readonly |
ColumnCreatedAt | createdAt |
ColumnUpdatedAt | updatedAt |
PrimaryUniqueId为"uniqueId"(不是id)。
5. 行为与联调注意点
- 主键:列表、Row 接口多以
uniqueId为路径参数或条件(见 backendroutes.go/crontab/:uniqueId)。 - 初始化:
InitRecords会插入readonly:1的内置任务;DeleteBy ... NOT IN UniqueIds用于删除非白名单遗留行,勿随意从UniqueIds移除仍在使用的uniqueId。 - Cron 侧:
main.go注册crontab.VideoProjectLogic等与uniqueId绑定的处理器;修改周期应通过DB 配置 + 拉取生效。
6. 相关代码路径
- 模型包:
core/repositories/models/crontab/ - 迁移与种子数据:
core/app/sev/db/internal/svc/init_database.go(initTableRecords) - Config RPC:
core/app/sev/db/internal/logic/configservice/crontab_*.go - HTTP:
core/app/sev/backend/internal/handler/config/crontab/ - Cron 拉取与录像计划:
core/app/sev/cron/internal/logic/fetch-data/crontab.go、internal/logic/crontab/video-project.go、internal/handler/crontab.go
