aa9f892a32
- 新增数据库配置项(DB_TYPE, DB_HOST, DB_PORT等),支持MySQL和PostgreSQL - 集成GORM实现数据库连接和自动迁移功能 - 添加定时任务调度器(cmd/scheduler),基于robfig/cron实现秒级调度 - 实现事件Hook体系,支持同步/异步处理和优先级排序 - 更新构建脚本,编译server、cli、scheduler三个二进制文件 - 配置systemd服务管理定时任务调度器 - 重构项目结构,新增crontab和hooks目录模块 - 更新README文档,完善各组件使用说明和部署配置
80 lines
1.9 KiB
Go
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 <名> 立即执行指定任务一次")
|
|
}
|