1.0
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
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
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user