157 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			157 lines
		
	
	
		
			4.6 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/service"
 | |
| 	"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"
 | |
| 	"git.huangwc.com/pig/pig-farm-controller/internal/websocket"
 | |
| )
 | |
| 
 | |
| // 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
 | |
| 
 | |
| 	// DeviceControlRepo 设备控制仓库实例
 | |
| 	DeviceControlRepo repository.DeviceControlRepo
 | |
| 
 | |
| 	// DeviceRepo 设备仓库实例
 | |
| 	DeviceRepo repository.DeviceRepo
 | |
| 
 | |
| 	// WebsocketManager WebSocket管理器
 | |
| 	WebsocketManager *websocket.Manager
 | |
| 
 | |
| 	// DeviceStatusPool 设备状态池实例
 | |
| 	DeviceStatusPool *service.DeviceStatusPool
 | |
| 
 | |
| 	// HeartbeatService 心跳服务实例
 | |
| 	HeartbeatService *service.HeartbeatService
 | |
| 
 | |
| 	// Config 应用配置
 | |
| 	Config *config.Config
 | |
| 
 | |
| 	// logger 日志组件实例
 | |
| 	logger *logs.Logger
 | |
| }
 | |
| 
 | |
| // NewApplication 创建并返回一个新的核心应用实例
 | |
| // 初始化所有核心组件
 | |
| func NewApplication(cfg *config.Config) *Application {
 | |
| 	return &Application{
 | |
| 		Config: cfg,
 | |
| 		logger: logs.NewLogger(),
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // Start 启动核心应用
 | |
| // 按正确顺序启动所有核心组件
 | |
| func (app *Application) Start() error {
 | |
| 	// 从配置中获取数据库连接字符串
 | |
| 	connectionString := app.Config.GetDatabaseConnectionString()
 | |
| 
 | |
| 	// 从配置中获取连接池参数
 | |
| 	maxOpenConns := app.Config.Database.MaxOpenConns
 | |
| 	maxIdleConns := app.Config.Database.MaxIdleConns
 | |
| 	connMaxLifetime := app.Config.Database.ConnMaxLifetime
 | |
| 
 | |
| 	// 初始化存储组件
 | |
| 	app.Storage = db.NewStorage(connectionString, maxOpenConns, maxIdleConns, connMaxLifetime)
 | |
| 
 | |
| 	// 启动存储组件
 | |
| 	if err := app.Storage.Connect(); err != nil {
 | |
| 		return fmt.Errorf("存储连接失败: %v", err)
 | |
| 	}
 | |
| 	app.logger.Info("存储连接成功")
 | |
| 
 | |
| 	// 初始化用户仓库
 | |
| 	app.UserRepo = repository.NewUserRepo(app.Storage.GetDB())
 | |
| 
 | |
| 	// 初始化操作历史仓库
 | |
| 	app.OperationHistoryRepo = repository.NewOperationHistoryRepo(app.Storage.GetDB())
 | |
| 
 | |
| 	// 初始化设备控制仓库
 | |
| 	app.DeviceControlRepo = repository.NewDeviceControlRepo(app.Storage.GetDB())
 | |
| 
 | |
| 	// 初始化设备仓库
 | |
| 	app.DeviceRepo = repository.NewDeviceRepo(app.Storage.GetDB())
 | |
| 
 | |
| 	// 初始化设备状态池
 | |
| 	app.DeviceStatusPool = service.NewDeviceStatusPool()
 | |
| 
 | |
| 	// 初始化WebSocket服务
 | |
| 	app.WebsocketManager = websocket.NewManager(app.DeviceRepo)
 | |
| 	// 设置WebSocket超时时间
 | |
| 	app.WebsocketManager.SetDefaultTimeout(app.Config.GetWebSocketConfig().Timeout)
 | |
| 
 | |
| 	// 初始化心跳服务
 | |
| 	app.HeartbeatService = service.NewHeartbeatService(app.WebsocketManager, app.DeviceStatusPool, app.DeviceRepo, app.Config)
 | |
| 
 | |
| 	// 初始化API组件
 | |
| 	app.API = api.NewAPI(app.Config, app.UserRepo, app.OperationHistoryRepo, app.DeviceControlRepo, app.DeviceRepo, app.WebsocketManager, app.HeartbeatService, app.DeviceStatusPool)
 | |
| 
 | |
| 	// 初始化任务执行器组件(使用5个工作协程)
 | |
| 	app.TaskExecutor = task.NewExecutor(5)
 | |
| 
 | |
| 	// 启动API组件
 | |
| 	if err := app.API.Start(); err != nil {
 | |
| 		return fmt.Errorf("API启动失败: %v", err)
 | |
| 	}
 | |
| 	app.logger.Info("API启动成功")
 | |
| 
 | |
| 	// 启动任务执行器组件
 | |
| 	app.logger.Info("启动任务执行器")
 | |
| 	app.TaskExecutor.Start()
 | |
| 
 | |
| 	// 启动心跳服务
 | |
| 	app.logger.Info("启动心跳服务")
 | |
| 	app.HeartbeatService.Start()
 | |
| 	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.logger.Info("停止任务执行器")
 | |
| 	app.TaskExecutor.Stop()
 | |
| 
 | |
| 	// 停止心跳服务
 | |
| 	app.logger.Info("停止心跳服务")
 | |
| 	app.HeartbeatService.Stop()
 | |
| 
 | |
| 	// 停止存储组件
 | |
| 	if err := app.Storage.Disconnect(); err != nil {
 | |
| 		return fmt.Errorf("存储断开连接失败: %v", err)
 | |
| 	}
 | |
| 	app.logger.Info("存储断开连接成功")
 | |
| 
 | |
| 	return nil
 | |
| }
 |