Files
pig-farm-controller/internal/core/application.go
2025-09-07 19:57:25 +08:00

104 lines
2.8 KiB
Go

// Package core 提供核心应用协调功能
// 负责初始化和协调API、任务执行器和存储等核心组件
// 管理整个应用的生命周期
package core
import (
"fmt"
"git.huangwc.com/pig/pig-farm-controller/internal/api"
"git.huangwc.com/pig/pig-farm-controller/internal/config"
"git.huangwc.com/pig/pig-farm-controller/internal/logs"
"git.huangwc.com/pig/pig-farm-controller/internal/storage/db"
"git.huangwc.com/pig/pig-farm-controller/internal/task"
)
// Application 代表核心应用结构
// 协调API、任务执行器和存储组件的工作
type Application struct {
// Storage 存储组件实例
Storage db.Storage
// API API组件实例
API *api.API
// TaskExecutor 任务执行器组件实例
TaskExecutor *task.Executor
// Config 应用配置
Config *config.Config
}
// NewApplication 创建并返回一个新的核心应用实例
// 初始化所有核心组件
func NewApplication(cfg *config.Config) *Application {
// 从配置中获取数据库连接字符串
connectionString := cfg.GetDatabaseConnectionString()
// 从配置中获取连接池参数
maxOpenConns := cfg.Database.MaxOpenConns
maxIdleConns := cfg.Database.MaxIdleConns
connMaxLifetime := cfg.Database.ConnMaxLifetime
// 初始化存储组件
store := db.NewStorage(connectionString, maxOpenConns, maxIdleConns, connMaxLifetime)
// 初始化API组件
apiInstance := api.NewAPI(cfg)
// 初始化任务执行器组件(使用5个工作协程)
taskExecutor := task.NewExecutor(5)
return &Application{
Storage: store,
Storage: store,
API: apiInstance,
TaskExecutor: taskExecutor,
Config: cfg,
logger: logger,
}
}
// Start 启动核心应用
// 按正确顺序启动所有核心组件
func (app *Application) Start() error {
// 启动存储组件
if err := app.Storage.Connect(); err != nil {
return fmt.Errorf("failed to connect to storage: %v", err)
}
app.logger.Info("Storage connected successfully")
// 启动API组件
if err := app.API.Start(); err != nil {
return fmt.Errorf("failed to start API: %v", err)
}
app.logger.Info("API started successfully")
// 启动任务执行器组件
app.TaskExecutor.Start()
app.logger.Info("Task executor started successfully")
return nil
}
// Stop 停止核心应用
// 按正确顺序停止所有核心组件
func (app *Application) Stop() error {
// 停止API组件
if err := app.API.Stop(); err != nil {
app.logger.Error(fmt.Sprintf("Failed to stop API: %v", err))
}
// 停止任务执行器组件
app.TaskExecutor.Stop()
app.logger.Info("Task executor stopped successfully")
// 停止存储组件
if err := app.Storage.Disconnect(); err != nil {
return fmt.Errorf("failed to disconnect from storage: %v", err)
}
app.logger.Info("Storage disconnected successfully")
return nil
}