package events import ( "awesomeProject/internal/config" "log" "sync" ) // ConfigEventManager 配置事件管理器 type ConfigEventManager struct { handlers map[string][]config.ConfigEventHandler // key: config_key, value: handlers mutex sync.RWMutex } var ( configEventManager *ConfigEventManager once sync.Once ) // GetConfigEventManager 获取配置事件管理器单例 func GetConfigEventManager() *ConfigEventManager { once.Do(func() { configEventManager = &ConfigEventManager{ handlers: make(map[string][]config.ConfigEventHandler), } }) return configEventManager } // RegisterHandler 注册配置事件处理器 func (cem *ConfigEventManager) RegisterHandler(handler config.ConfigEventHandler) { cem.mutex.Lock() defer cem.mutex.Unlock() configKeys := handler.GetConfigKeys() for _, key := range configKeys { if cem.handlers[key] == nil { cem.handlers[key] = []config.ConfigEventHandler{} } cem.handlers[key] = append(cem.handlers[key], handler) } log.Printf("注册配置事件处理器,监听配置: %v", configKeys) } // TriggerEvent 触发配置变更事件 func (cem *ConfigEventManager) TriggerEvent(event config.ConfigEvent) { cem.mutex.RLock() handlers := cem.handlers[event.ConfigKey] cem.mutex.RUnlock() if len(handlers) == 0 { log.Printf("配置 %s 无对应的事件处理器", event.ConfigKey) return } log.Printf("触发配置变更事件: %s, 旧值: %v, 新值: %v", event.ConfigKey, event.OldValue, event.NewValue) // 并发处理事件,避免阻塞 for _, handler := range handlers { go func(h config.ConfigEventHandler) { if err := h.Handle(event); err != nil { log.Printf("处理配置事件失败: %s, 错误: %v", event.ConfigKey, err) } }(handler) } } // ListRegisteredHandlers 列出已注册的处理器(用于调试) func (cem *ConfigEventManager) ListRegisteredHandlers() map[string]int { cem.mutex.RLock() defer cem.mutex.RUnlock() result := make(map[string]int) for key, handlers := range cem.handlers { result[key] = len(handlers) } return result }