121 lines
3.3 KiB
Go
121 lines
3.3 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/storage/repository"
|
|
"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
|
|
|
|
// UserRepo 用户仓库实例
|
|
UserRepo repository.UserRepo
|
|
|
|
// OperationHistoryRepo 操作历史仓库实例
|
|
OperationHistoryRepo repository.OperationHistoryRepo
|
|
|
|
// Config 应用配置
|
|
Config *config.Config
|
|
|
|
// logger 日志组件实例
|
|
logger *logs.Logger
|
|
}
|
|
|
|
// 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)
|
|
|
|
// 初始化用户仓库
|
|
userRepo := repository.NewUserRepo(store.GetDB())
|
|
|
|
// 初始化操作历史仓库
|
|
operationHistoryRepo := repository.NewOperationHistoryRepo(store.GetDB())
|
|
|
|
// 初始化API组件
|
|
apiInstance := api.NewAPI(cfg, userRepo, operationHistoryRepo)
|
|
|
|
// 初始化任务执行器组件(使用5个工作协程)
|
|
taskExecutor := task.NewExecutor(5)
|
|
|
|
return &Application{
|
|
Storage: store,
|
|
API: apiInstance,
|
|
TaskExecutor: taskExecutor,
|
|
UserRepo: userRepo,
|
|
OperationHistoryRepo: operationHistoryRepo,
|
|
Config: cfg,
|
|
logger: logs.NewLogger(),
|
|
}
|
|
}
|
|
|
|
// Start 启动核心应用
|
|
// 按正确顺序启动所有核心组件
|
|
func (app *Application) Start() error {
|
|
// 启动存储组件
|
|
if err := app.Storage.Connect(); err != nil {
|
|
return fmt.Errorf("存储连接失败: %v", err)
|
|
}
|
|
app.logger.Info("存储连接成功")
|
|
|
|
// 启动API组件
|
|
if err := app.API.Start(); err != nil {
|
|
return fmt.Errorf("API启动失败: %v", err)
|
|
}
|
|
app.logger.Info("API启动成功")
|
|
|
|
// 启动任务执行器组件
|
|
app.TaskExecutor.Start()
|
|
app.logger.Info("任务执行器启动成功")
|
|
|
|
return nil
|
|
}
|
|
|
|
// Stop 停止核心应用
|
|
// 按正确顺序停止所有核心组件
|
|
func (app *Application) Stop() error {
|
|
// 停止API组件
|
|
if err := app.API.Stop(); err != nil {
|
|
app.logger.Error(fmt.Sprintf("API停止失败: %v", err))
|
|
}
|
|
|
|
// 停止任务执行器组件
|
|
app.TaskExecutor.Stop()
|
|
app.logger.Info("任务执行器已停止")
|
|
|
|
// 停止存储组件
|
|
if err := app.Storage.Disconnect(); err != nil {
|
|
return fmt.Errorf("存储断开连接失败: %v", err)
|
|
}
|
|
app.logger.Info("存储断开连接成功")
|
|
|
|
return nil
|
|
}
|