Files
apiServer-service/cmd/scheduler/main.go
T
shiran aa9f892a32 feat: 添加数据库集成、定时任务调度器和事件Hook体系
- 新增数据库配置项(DB_TYPE, DB_HOST, DB_PORT等),支持MySQL和PostgreSQL
- 集成GORM实现数据库连接和自动迁移功能
- 添加定时任务调度器(cmd/scheduler),基于robfig/cron实现秒级调度
- 实现事件Hook体系,支持同步/异步处理和优先级排序
- 更新构建脚本,编译server、cli、scheduler三个二进制文件
- 配置systemd服务管理定时任务调度器
- 重构项目结构,新增crontab和hooks目录模块
- 更新README文档,完善各组件使用说明和部署配置
2026-04-15 12:39:59 +08:00

80 lines
1.9 KiB
Go

package main
import (
"apiServer_service/crontab"
"apiServer_service/crontab/tasks"
db "apiServer_service/models/database"
"apiServer_service/utils/logger"
"fmt"
"os"
"os/signal"
"syscall"
"github.com/joho/godotenv"
)
func init() {
if err := godotenv.Load(".env"); err != nil {
fmt.Println("Warning: .env file not found, using system environment variables")
}
}
func main() {
if os.Getenv("DB_TYPE") != "" {
db.ConnectDatabase()
}
scheduler := crontab.DefaultScheduler()
tasks.RegisterTasks(scheduler)
if len(os.Args) > 1 {
switch os.Args[1] {
case "run-once":
logger.CronInfo("Scheduler", "立即执行所有任务")
scheduler.RunOnce()
return
case "run":
if len(os.Args) > 2 {
name := os.Args[2]
if scheduler.RunTaskByName(name) {
logger.CronInfo("Scheduler", fmt.Sprintf("任务执行完成: %s", name))
} else {
logger.CronError("Scheduler", fmt.Sprintf("未找到任务: %s", name))
}
return
}
logger.CronError("Scheduler", "用法: scheduler run <任务名>")
return
case "list":
fmt.Println("已注册任务:")
for _, task := range scheduler.GetTasks() {
fmt.Printf(" - %-20s %s\n", task.Name(), task.Spec())
}
return
default:
fmt.Printf("未知命令: %s\n", os.Args[1])
printUsage()
return
}
}
scheduler.Start()
logger.CronInfo("Scheduler", "调度器已启动")
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
logger.CronInfo("Scheduler", "正在停止...")
scheduler.Stop()
logger.CronInfo("Scheduler", "已停止")
}
func printUsage() {
fmt.Println("用法:")
fmt.Println(" scheduler 启动调度器(后台常驻)")
fmt.Println(" scheduler list 列出所有已注册任务")
fmt.Println(" scheduler run-once 立即执行所有任务一次")
fmt.Println(" scheduler run <名> 立即执行指定任务一次")
}