定时任务
项目有两套可独立控制的定时任务:热点抓取调度器和 AI 每日简报调度器。
热点抓取调度器
配置:
dotenv
SCHEDULER_AUTO_START=false
SCHEDULER_CRON_EXPRESSION=0 */12 * * *
IGNORE_SAVE_SOURCES=v2ex,githubSCHEDULER_AUTO_START 决定应用启动时是否自动启动。运行期间可以通过 API 控制:
bash
# 查看状态
curl http://localhost:6689/api/scheduler/status
# 启动
curl -X POST http://localhost:6689/api/scheduler/start
# 停止
curl -X POST http://localhost:6689/api/scheduler/stop
# 重新加载 Cron 配置
curl -X POST http://localhost:6689/api/scheduler/reconfigure手动触发全部来源:
bash
curl -X POST http://localhost:6689/api/scheduler/trigger手动触发单个来源:
bash
curl -X POST http://localhost:6689/api/scheduler/trigger \
-H 'Content-Type: application/json' \
-d '{"source":"zhihu"}'手动触发立即返回 202 和 runId。用 GET /api/scheduler/runs/:runId 查询 running、completed 或 failed,完成后可看到各来源的成功状态、数量和错误;接口不会返回抓取的完整条目。记录只保存在接收请求的进程内,最多保留一小时,重启后消失。多实例部署时应通过同一实例查询任务状态。
bash
curl http://localhost:6689/api/scheduler/runs/<runId>来源级配置
来源配置保存在 MongoDB,包括是否启用、抓取间隔和最后抓取时间。
bash
curl http://localhost:6689/api/scheduler/configs修改知乎的配置:
bash
curl -X PUT http://localhost:6689/api/scheduler/config/zhihu \
-H 'Content-Type: application/json' \
-d '{"enabled":true,"interval":30}'interval 单位是分钟,允许 1–10080。每次全局 Cron 触发时,调度器只抓取距上次成功刷新已达到来源间隔的源。修改间隔后在下一次 Cron 自动生效;手动触发不受间隔限制。reconfigure 只重新注册当前进程中的 Cron,不会重新读取 .env。
查看不会写入历史数据库的来源:
bash
curl http://localhost:6689/api/scheduler/ignored-sources每日简报调度器
配置:
dotenv
BRIEF_ENABLED=false
BRIEF_CRON_EXPRESSION=0 12 * * *
BRIEF_TIMEZONE=Asia/Shanghai运行时控制:
bash
curl http://localhost:6689/api/briefs/scheduler/status
curl -X POST http://localhost:6689/api/briefs/scheduler/start
curl -X POST http://localhost:6689/api/briefs/scheduler/stop
curl -X POST http://localhost:6689/api/briefs/scheduler/reconfigure简报调度会调用外部热榜、配置的搜索平台和模型服务。开发环境建议保持 BRIEF_ENABLED=false,需要时使用手动生成接口。
状态与持久性
- API 启停只改变当前 Node.js 进程的运行状态。
- 进程重启后会重新读取
SCHEDULER_AUTO_START和BRIEF_ENABLED。 - 修改
.env后必须重启服务;仅调用reconfigure不会让ConfigService重新读取文件。 - 多实例部署时,每个进程都会有自己的调度器。应只让一个实例启用自动任务,避免重复抓取和生成。
- 维护期间可先停止任务,操作结束后再启动,并检查状态接口。
调度器的代码结构与注册机制见调度器实现。