动态定时任务配置说明
概述
现在支持从 .env 文件中动态配置定时任务的执行时间,基于 NestJS 官方文档 实现,无需修改代码即可调整定时任务的执行频率。
环境变量配置
在 .env 文件中添加以下配置:
bash
# 定时任务开关
SCHEDULER_AUTO_START=false
# 定时任务执行时间(cron 表达式)
SCHEDULER_CRON_EXPRESSION=0 */12 * * *配置说明
SCHEDULER_AUTO_START
- 类型: boolean
- 仓库示例值:
false - 说明: 控制是否在应用启动时自动启动定时任务
- 可选值:
true: 自动启动定时任务false: 不自动启动,需要手动启动
SCHEDULER_CRON_EXPRESSION
- 类型: string
- 默认值:
0 */12 * * *(每12小时执行一次) - 说明: 标准的 cron 表达式,定义定时任务的执行频率
支持的 Cron 表达式格式
小时级别
bash
# 每12小时执行一次
SCHEDULER_CRON_EXPRESSION=0 */12 * * *
# 每6小时执行一次
SCHEDULER_CRON_EXPRESSION=0 */6 * * *
# 每4小时执行一次
SCHEDULER_CRON_EXPRESSION=0 */4 * * *
# 每2小时执行一次
SCHEDULER_CRON_EXPRESSION=0 */2 * * *
# 每1小时执行一次
SCHEDULER_CRON_EXPRESSION=0 */1 * * *分钟级别
bash
# 每30分钟执行一次
SCHEDULER_CRON_EXPRESSION=*/30 * * * *
# 每15分钟执行一次
SCHEDULER_CRON_EXPRESSION=*/15 * * * *
# 每10分钟执行一次
SCHEDULER_CRON_EXPRESSION=*/10 * * * *
# 每5分钟执行一次
SCHEDULER_CRON_EXPRESSION=*/5 * * * *特定时间
bash
# 每天午夜执行一次
SCHEDULER_CRON_EXPRESSION=0 0 * * *
# 每天上午8点执行一次
SCHEDULER_CRON_EXPRESSION=0 8 * * *
# 每天下午2点执行一次
SCHEDULER_CRON_EXPRESSION=0 14 * * *使用示例
开发环境配置
bash
# .env
SCHEDULER_AUTO_START=false
SCHEDULER_CRON_EXPRESSION=*/5 * * * *生产环境配置
bash
# .env
SCHEDULER_AUTO_START=true
SCHEDULER_CRON_EXPRESSION=0 */6 * * *测试环境配置
bash
# .env
SCHEDULER_AUTO_START=true
SCHEDULER_CRON_EXPRESSION=0 */2 * * *API 接口
查看定时任务状态
bash
curl http://localhost:6688/api/scheduler/status响应示例:
json
{
"isRunning": false,
"schedulerEnabled": true,
"cronJobs": 1,
"ignoreSources": ["v2ex", "github"],
"cronExpression": "0 */12 * * *",
"cronJobExists": true
}手动启动定时任务
bash
curl -X POST http://localhost:6688/api/scheduler/start手动停止定时任务
bash
curl -X POST http://localhost:6688/api/scheduler/stop重新配置定时任务
bash
curl -X POST http://localhost:6688/api/scheduler/reconfigure手动触发数据抓取
bash
# 抓取所有数据源
curl -X POST http://localhost:6688/api/scheduler/trigger
# 抓取特定数据源
curl -X POST http://localhost:6688/api/scheduler/trigger \
-H "Content-Type: application/json" \
-d '{"source": "zhihu"}'技术实现
核心组件
- SchedulerRegistry: NestJS 提供的定时任务注册表,用于管理动态定时任务
- CronJob: 来自
cron包的定时任务类,支持标准的 cron 表达式 - ConfigService: 用于读取环境变量配置
实现原理
- 在
onModuleInit生命周期中读取环境变量配置 - 使用
CronJob创建定时任务实例 - 通过
SchedulerRegistry.addCronJob()注册定时任务 - 支持运行时重新配置和停止/启动定时任务
代码示例
typescript
// 创建动态定时任务
const job = new CronJob(cronExpression, () => {
this.handleCron();
});
// 注册到 SchedulerRegistry
this.schedulerRegistry.addCronJob(this.cronJobName, job);
job.start();注意事项
- Cron 表达式: 使用标准的 cron 表达式格式,支持所有标准的 cron 语法
- 重启生效: 修改
.env文件后需要重启应用才能生效 - 日志监控: 定时任务的执行情况会在日志中记录
- 错误处理: 如果配置的 cron 表达式无效,系统会记录错误日志
- 资源管理: 在应用销毁时会自动清理定时任务资源
日志示例
启动时的日志
[SchedulerService] Scheduler auto-start: enabled
[SchedulerService] Dynamic cron job setup with expression: 0 */12 * * *执行时的日志
[SchedulerService] handleCron
[SchedulerService] Scheduling fetch for source: zhihu
[SchedulerService] Scheduling fetch for source: weibo停止时的日志
[SchedulerService] Stopped cron job: hot-data-fetch
[SchedulerService] Scheduler disabled