全栈框架定时任务怎么加?

访客 全栈框架 1

本文目录导读:

  1. Node.js 生态(Nest.js / Egg.js / Midway)
  2. Python 生态(Flask / Django / FastAPI)
  3. Java 生态(Spring Boot)
  4. Go 生态(Gin / Beego)
  5. 前端独立定时任务
  6. 选择建议
  7. 重要注意事项

全栈框架中添加定时任务通常有几种常见方案,具体取决于你使用的框架生态,以下是主流方案的分场景说明:

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)

重要注意事项

  1. 避免重复执行:在集群环境中需确保只执行一次(Redis锁)
  2. 错误处理:添加try-catch防止任务中止
  3. 超时控制:设置超时时间防止阻塞
  4. 日志记录:记录任务执行状态便于排错
  5. 数据库连接:长任务需考虑连接池耗尽问题

扩展阅读

标签: 定时任务 全栈框架

抱歉,评论功能暂时关闭!