调度中心
调度中心把系统内置的 25 个定时任务集中到一处:启停、改周期、手动触发与看执行日志,面向需要确认「后台在跑什么、跑得怎么样」的管理员。
25 个内置任务,全部可观测可干预
页头是「计划任务调度中心 / 统一管理可操作的业务调度任务」,计数含总计、运行中、异常、离线、执行器数、停用数、24h 成功、24h 失败与分布式锁持有者。
- 改周期不用手写 cron:可视化构建器 + 7 个常用模板 + 未来 5 次执行预览
- 手动触发可指定目标实例,触发后自动跳到这次 fire 的详情
- 执行日志写「做了多少」,不是「处理中…」

能做什么
- 启停任务、改触发方式与周期、手动触发。
- 查看每次 fire 的结果与日志,终止或重试。
- 设定全局日志清理策略。
界面与操作
25 个任务清单
系统共注册 25 个任务,下表按界面筛选用的分组口径排列。
| 分组 | 任务键 | 默认周期 | 说明 |
|---|---|---|---|
Infrastructure | scheduler.kernel | 手动 | 调度内核,系统任务,默认停用 |
| 基础设施 | registry.cleanup | 30 秒 | 注册记录清理 |
infrastructure.heartbeat.check | 15 秒 | 启动即跑,巡检服务注册、数据库与存储源心跳 | |
gdrive-cdn.optimize | 60 秒 | DoH 选延迟最低的 Google CDN IP,对播放代理无感切换 | |
| 媒体库 | central-media.sync | 300 秒 | 中央媒体库同步 |
virtual-library.api-refresh | 180 秒 | 虚拟媒体库 API 刷新 | |
sync.queue.process | 30 秒 | 同步队列处理 | |
webhook.delivery | 30 秒 | 入库事件异步投递,失败持久化重试 | |
| 媒体刮削 | scrape.queue | 15 秒 | 刮削队列处理 |
scrape.probe-backfill | 3600 秒 | 探测补全,默认停用 | |
scrape.episode-metadata-backfill | cron 0 30 4 * * *(Asia/Shanghai) | 补齐缺简介、剧照的剧集 | |
| 存储 | file-change-log.scrape | 15 秒 | 重放文件变更日志,增量入队刮削 |
organizer.delete.poll | 15 秒 | 轮询媒体整理批量删除 | |
link-cache.evict | 300 秒 | 播放直链缓存淘汰 | |
provider.block.release | 60 秒 | 解除阻塞的挂载源 | |
provider.token.refresh | 1500 秒 | 刷新将过期的 Google Drive / 115 token | |
| 传输 | transfer.dispatch | 3 秒 | 存储任务派发 |
transfer.progress.flush | 3 秒 | 任务进度落盘 | |
transfer.parent.reconcile | 15 秒 | 父任务状态对账 | |
transfer.failed.requeue | 15 秒 | 退避到期的 FAILED 重置为 WAITING | |
spool.retention.cleanup | 3600 秒 | spool 保留期清理 | |
| 用户 | account.expiry.notify | cron 0 0 2 * * * | 账号到期提醒,邮件或 Telegram |
stream.cleanup | 120 秒 | 播放流会话清理 | |
telegram.game.due-scan | 60 秒 | Telegram 游戏到期扫描 | |
| 播放 | policy.refresh | 120 秒 | 播放策略刷新 |
TIP
周期为代码默认值,可在「配置」Tab 改。说明列中带具体动作的条目取自代码与页面文案,其余为任务键的字面含义,实际行为以执行日志为准。服务口径与分组口径不完全一致:provider.token.refresh 跑在 media 上,分组标「存储」。
触发方式与调度策略
| 配置项 | 可选值 |
|---|---|
| 启用 / 停用 | 即暂停与恢复,落库字段 desiredEnabled |
| 触发方式 | MANUAL / CRON / FIXED_DELAY |
| cron 表达式 | 6 段含秒,与时区一起保存 |
| cron 构建器 | 每 N 分钟 / 每小时 / 每天 / 每周 / 每月 / 自定义;周几 MON–SUN,可反向识别已输入的表达式 |
| 常用模板 | 7 个:每 5 分、每 15 分、每小时、每天 02:00、每天 04:00、每周一 03:00、每月 1 日 03:00 |
| 未来 5 次执行预览 | 服务端计算,表达式有误时给提示 |
| 启动后立即执行 | runOnStartup |
| 路由策略 | FAILOVER_ONCE / ROUND_ROBIN |
| 阻塞策略 | SERIAL / DISCARD_LATER / COVER_EARLY |
| 错过调度策略 | DO_NOTHING / FIRE_ONCE_NOW |
| 超时秒数 | 0 不限制 |
| 失败重试次数 | ≥ 0 的整数 |
页面注明:当前一期以单实例派发为主,轮询、补偿与覆盖策略先在配置层预留。
手动触发
「立即执行」走 POST /tasks/{taskKey}/run,可带 targetInstanceId,留空自动选实例。任务离线或 manualRunAllowed=false 时按钮禁用并说明原因,触发后自动跳到这次 fire 的详情。
四个详情 Tab
| Tab | 看什么 |
|---|---|
| 任务概览 | 任务基本信息与当前状态 |
| 配置 | 上表全部调度参数;系统任务只读 |
| 执行历史 | 分页 fire 记录,显示「第 X/Y 页,共 N 条」 |
| 实例状态 | 执行器(instanceId)状态 |
执行历史可按触发来源 SCHEDULE / MANUAL / RETRY、执行状态 PENDING / DISPATCHING / DISPATCHED / RUNNING / COMPLETED / MISFIRE_SKIPPED / TRIGGER_FAILED / FAILED / TIMEOUT(另有 SUCCEEDED / SKIPPED / KILLED 文案)、时间范围近 24h 或近 7 天、目标实例 ID 筛选,并有「刷新历史」与「清理当前任务」。
任务列表按服务、分组、等级(BUSINESS / SYSTEM)与状态(RUNNING / ERROR / OFFLINE / IDLE / DISABLED)筛选,排序优先级为运行中 > 异常 > 离线 > 可手动 > 空闲,视图状态存 localStorage。
Fire 详情抽屉
显示任务、目标实例与结果;执行结果含 startAt、endAt、status、resultCode、errorMessage、进度与重试次数;执行日志用 LogViewer 展示最多 200 条,每条带时间戳、级别与消息。操作有「终止」(/fires/{id}/kill)与「重试」(/fires/{id}/retry,生成新 fire)。
执行日志规范
Media、Storage、User、Config 各有一份同名 TaskExecutionLog,经 runtimeTracker.updateProgress(taskKey, percent, text) 写进 fire 日志。事件类型 start(scope)、plan(total)、success(i, id, ms, detail)、skip、fail、milestone(pct, text)、summary(detail);百分比由 plan 推算(5%–95%),milestone 可覆盖,summary 固定 100%。写法分迭代型、一次性扫描型、多阶段里程碑型。
[3/26] OK 国产剧/GoogleDrive (sourceId=12) · 14.2s · 处理 235 条级别上 fire 日志只落 INFO(fire started / progress N% / fire completed)与 ERROR(异常消息),心跳巡检另产出 INFO / WARN 检查行。6 条强制约束:在 execute 闭包内构造、start 必须首行、summary 走全路径、identifier 可定位、detail 写量化结果、错误保留原因短语。Worker 层契约要求业务方法返回可量化结果(int 或具名 record),已改造 11 个,如 CleanupStats(deleted, bytesReclaimed)、NotifyStats(candidates, sent, skipped, warnDays)、ScanStats(refreshed, skipped, failed, total)。
日志留存
「日志清理策略」两种模式:HOURS(默认 720,即 30 天 × 24,范围 1–87600)与 MAX_RECORDS(默认 50000,范围 1–5,000,000),默认 HOURS。POST /history/cleanup 可全局或按 taskKey 立即清理并返回 deletedCount;后端另有 history-retention-days: 30。
关键规则
- 任务总数是 25 个,以代码注册结果为准。
- 系统任务(
SYSTEM)配置只读,业务任务(BUSINESS)才可改。 scheduler.kernel与scrape.probe-backfill默认停用。- 「重试」不改写原 fire,而是生成一条新记录。
相关接口
/tasks、/tasks/{taskKey}、/tasks/{taskKey}/run、/fires/{id}、/fires/{id}/kill、/fires/{id}/retry、/history/cleanup