本文目录导读:
- Node.js 生态(Nest.js / Egg.js / Midway)
- Python 生态(Flask / Django / FastAPI)
- Java 生态(Spring Boot)
- Go 生态(Gin / Beego)
- 前端独立定时任务
- 选择建议
- 重要注意事项
全栈框架中添加定时任务通常有几种常见方案,具体取决于你使用的框架生态,以下是主流方案的分场景说明:
Node.js 生态(Nest.js / Egg.js / Midway)
Nest.js(推荐使用 @nestjs/schedule)
// 安装
npm install @nestjs/schedule
// app.module.ts
import { ScheduleModule } from '@nestjs/schedule';
@Module({
imports: [ScheduleModule.forRoot()],
})
// 在service中使用
import { Injectable } from '@nestjs/common';
import { Cron } from '@nestjs/schedule';
@Injectable()
export class TasksService {
@Cron('30 * * * * *') // 每30秒执行
handleCron() {
console.log('定时任务执行');
}
}
Egg.js(使用 @egg-schedule 插件)
// config/plugin.js
exports.schedule = {
enable: true,
package: 'egg-schedule',
};
// app/schedule/clearLog.js
module.exports = {
schedule: {
interval: '1h', // 1小时执行
type: 'worker', // 只在一个worker中执行
},
async task(ctx) {
await ctx.service.log.clear();
},
};
Python 生态(Flask / Django / FastAPI)
Flask(使用 APScheduler)
from flask import Flask
from apscheduler.schedulers.background import BackgroundScheduler
app = Flask(__name__)
scheduler = BackgroundScheduler()
def my_task():
print("定时任务执行")
# 启动时加载
scheduler.add_job(my_task, 'interval', hours=1)
scheduler.start()
Django(使用 Celery + Celery Beat)
# tasks.py
from celery import Celery
from celery.schedules import crontab
app = Celery('tasks', broker='redis://localhost:6379')
@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
sender.add_periodic_task(10.0, test.s(), name='每10秒')
@app.task
def test():
print('定时任务')
# 启动 beat
celery -A tasks beat
Java 生态(Spring Boot)
Spring Boot(@Scheduled 注解)
@SpringBootApplication
@EnableScheduling
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@Component
public class ScheduledTasks {
@Scheduled(cron = "0 0/30 * * * ?") // 每30分钟
public void reportCurrentTime() {
System.out.println("定时任务执行");
}
}
Go 生态(Gin / Beego)
Gin(使用 robfig/cron)
package main
import (
"github.com/robfig/cron/v3"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
c := cron.New()
c.AddFunc("@every 30s", func() {
log.Println("定时任务执行")
})
c.Start()
r.Run()
}
前端独立定时任务
React(使用 setInterval)
import { useEffect } from 'react';
function TimerTask() {
useEffect(() => {
const interval = setInterval(() => {
console.log('前端定时任务');
}, 10000);
return () => clearInterval(interval); // 清理
}, []);
return <div>定时器组件</div>;
}
选择建议
| 场景 | 推荐方案 |
|---|---|
| 简单定时任务 | 框架内置的@Scheduled类注解 |
| 复杂调度(分布式) | Celery / Bull / Sidekiq |
| 需要持久化 | Quartz / APScheduler with DB |
| 云原生 | 云平台定时触发器(如AWS Lambda) |
重要注意事项
- 避免重复执行:在集群环境中需确保只执行一次(Redis锁)
- 错误处理:添加try-catch防止任务中止
- 超时控制:设置超时时间防止阻塞
- 日志记录:记录任务执行状态便于排错
- 数据库连接:长任务需考虑连接池耗尽问题
扩展阅读: