package main import ( "context" "fmt" "gat1400Exchange/nvcs" "net/http" "os" "os/signal" "syscall" "gat1400Exchange/client" "gat1400Exchange/config" "gat1400Exchange/cron" "gat1400Exchange/models" "gat1400Exchange/pkg/logger" "gat1400Exchange/routes" "gat1400Exchange/service" ) func main() { // 初始化日志 logger.InitLog(config.LogConf.LogWay, config.LogConf.Path+"/gat1400-exchange.log", config.LogConf.Level, config.LogConf.MaxAge, false) logger.Info("gat1400-exchange start!") // 连接数据库 models.Init() defer models.CloseDB() // 注册所有路由 r := routes.InitRoutes() host := config.ServeConf.Host port := config.ServeConf.Port srv := &http.Server{ Addr: fmt.Sprintf("%s:%s", host, port), Handler: r, } srv.SetKeepAlivesEnabled(config.ServeConf.Keepalive) // Initializing the server in a goroutine so that // it won't block the graceful shutdown handling below go func() { if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { logger.Error("listen: %s", err) } }() logger.Info("Server is running at %s:%s", host, port) // 启动1400客户端 ctx, cancel := context.WithCancel(context.Background()) go client.Init1400Client(ctx) // 启动网络视频字符叠加器服务 go nvcs.StartNVCSServer(ctx) go service.InitSubscribeNotificationTasks() // 启动定时任务 cron.Init() // Wait for interrupt signal to gracefully shutdown the server with // a timeout of 5 seconds. quit := make(chan os.Signal) // kill (no param) default send syscall.SIGTERM // kill -2 is syscall.SIGINT // kill -9 is syscall.SIGKILL but can't be catch, so don't need add it signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) <-quit logger.Info("Shutting down server...") // The context is used to inform the server it has 5 seconds to finish // the request it is currently handling //ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) cancel() if err := srv.Shutdown(ctx); err != nil { logger.Error("Server forced to shutdown:", err) } service.StopNotificationTasks() logger.Info("Server exiting!") }