2026-04-29 15:54:14 +08:00
|
|
|
|
package main
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
|
"context"
|
2026-05-21 10:41:37 +08:00
|
|
|
|
"model-gateway/model/dto"
|
2026-05-29 17:54:19 +08:00
|
|
|
|
"model-gateway/service/job"
|
|
|
|
|
|
"model-gateway/service/task"
|
2026-04-29 15:54:14 +08:00
|
|
|
|
"os"
|
|
|
|
|
|
"os/signal"
|
|
|
|
|
|
"syscall"
|
2026-05-12 13:45:08 +08:00
|
|
|
|
"time"
|
2026-04-29 15:54:14 +08:00
|
|
|
|
|
2026-05-15 14:56:26 +08:00
|
|
|
|
"model-gateway/controller"
|
2026-04-29 15:54:14 +08:00
|
|
|
|
|
|
|
|
|
|
"gitea.com/red-future/common/http"
|
|
|
|
|
|
"gitea.com/red-future/common/jaeger"
|
|
|
|
|
|
_ "gitea.com/red-future/common/swagger"
|
|
|
|
|
|
_ "github.com/gogf/gf/contrib/drivers/pgsql/v2"
|
|
|
|
|
|
_ "github.com/gogf/gf/contrib/nosql/redis/v2"
|
|
|
|
|
|
"github.com/gogf/gf/v2/frame/g"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
|
|
|
|
defer cancel()
|
|
|
|
|
|
defer jaeger.ShutDown(ctx)
|
|
|
|
|
|
|
|
|
|
|
|
// 注册路由
|
|
|
|
|
|
http.RouteRegister([]interface{}{
|
|
|
|
|
|
controller.Model,
|
|
|
|
|
|
controller.Task,
|
|
|
|
|
|
controller.Stat,
|
|
|
|
|
|
})
|
|
|
|
|
|
|
2026-05-12 13:45:08 +08:00
|
|
|
|
// 本地调试:可选自动触发 worker/cleaner(由配置文件控制)
|
|
|
|
|
|
startAutoRunner(ctx)
|
|
|
|
|
|
|
2026-05-18 19:19:16 +08:00
|
|
|
|
// 监听退出信号,确保 Ctrl+C 能完整退出(停止 worker/cleaner 并关闭 gateway server)
|
2026-04-29 15:54:14 +08:00
|
|
|
|
quit := make(chan os.Signal, 1)
|
|
|
|
|
|
signal.Notify(quit, os.Interrupt, syscall.SIGTERM)
|
|
|
|
|
|
<-quit
|
|
|
|
|
|
|
|
|
|
|
|
g.Log().Infof(ctx, "[main] 收到退出信号,开始优雅退出...")
|
|
|
|
|
|
cancel()
|
2026-05-18 19:19:16 +08:00
|
|
|
|
// 关闭 gateway server(RouteRegister 内部是 go Httpserver.Run() 启动的)
|
2026-04-29 15:54:14 +08:00
|
|
|
|
_ = http.Httpserver.Shutdown()
|
|
|
|
|
|
}
|
2026-05-12 13:45:08 +08:00
|
|
|
|
|
|
|
|
|
|
func startAutoRunner(ctx context.Context) {
|
|
|
|
|
|
// cleaner
|
|
|
|
|
|
if g.Cfg().MustGet(ctx, "asynch.cleaner.enabled").Bool() {
|
|
|
|
|
|
interval := g.Cfg().MustGet(ctx, "asynch.cleaner.intervalSeconds").Int()
|
|
|
|
|
|
if interval <= 0 {
|
|
|
|
|
|
interval = 30
|
|
|
|
|
|
}
|
|
|
|
|
|
ticker := time.NewTicker(time.Duration(interval) * time.Second)
|
|
|
|
|
|
go func() {
|
|
|
|
|
|
defer ticker.Stop()
|
|
|
|
|
|
for {
|
|
|
|
|
|
select {
|
|
|
|
|
|
case <-ctx.Done():
|
|
|
|
|
|
return
|
|
|
|
|
|
case <-ticker.C:
|
2026-05-29 17:54:19 +08:00
|
|
|
|
_, _ = job.Cleaner.RunOnce(ctx)
|
2026-05-12 13:45:08 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}()
|
|
|
|
|
|
}
|
2026-06-02 20:26:45 +08:00
|
|
|
|
|
|
|
|
|
|
// queryPending
|
|
|
|
|
|
if g.Cfg().MustGet(ctx, "asynch.queryPending.enabled").Bool() {
|
|
|
|
|
|
interval := g.Cfg().MustGet(ctx, "asynch.queryPending.intervalSeconds", 10).Int()
|
|
|
|
|
|
limit := g.Cfg().MustGet(ctx, "asynch.queryPending.limit", 10).Int()
|
|
|
|
|
|
ticker := time.NewTicker(time.Duration(interval) * time.Second)
|
|
|
|
|
|
go func() {
|
|
|
|
|
|
defer ticker.Stop()
|
|
|
|
|
|
for {
|
|
|
|
|
|
select {
|
|
|
|
|
|
case <-ctx.Done():
|
|
|
|
|
|
return
|
|
|
|
|
|
case <-ticker.C:
|
|
|
|
|
|
if _, err := task.Task.QueryPendingTasks(ctx, &dto.QueryPendingTasksReq{Limit: limit}); err != nil {
|
|
|
|
|
|
g.Log().Warningf(ctx, "[auto-queryPending] run once failed: %v", err)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}()
|
|
|
|
|
|
}
|
2026-05-12 13:45:08 +08:00
|
|
|
|
}
|