82 lines
2.0 KiB
Go
82 lines
2.0 KiB
Go
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
|
|
}
|
|
|
|
|