| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- package config
- import (
- "os"
- "time"
- klog "github.com/sirupsen/logrus"
- "github.com/spf13/viper"
- )
- // startConfigFileWatcher 启动配置文件轮询监听
- func startConfigFileWatcher(configFile string, v *viper.Viper) {
- if configFile == "" {
- klog.Warnf("⚠️ [CONFIG] ConfigFileUsed() returned empty string, cannot start polling watcher")
- return
- }
- klog.Infof("✓ [CONFIG] Starting polling watcher for: %s", configFile)
- go func() {
- lastModTime := time.Now()
- // 初始化时获取文件的修改时间
- if info, err := os.Stat(configFile); err == nil {
- lastModTime = info.ModTime()
- klog.Infof("✓ [CONFIG] Initial file modTime: %v", lastModTime)
- }
- ticker := time.NewTicker(1 * time.Second)
- defer ticker.Stop()
- for {
- select {
- case <-ticker.C:
- info, err := os.Stat(configFile)
- if err != nil {
- // 文件不存在或无法访问,跳过本次检查
- klog.Debugf("⏭️ [CONFIG] Cannot stat config file: %v", err)
- continue
- }
- // 检查文件修改时间是否变化
- if info.ModTime().After(lastModTime) {
- lastModTime = info.ModTime()
- klog.Infof("🔔 [CONFIG] Config file changed detected by polling: %s (modTime: %v)", configFile, lastModTime)
- configMutex.Lock()
- // 重新加载配置
- if err := v.ReadInConfig(); err != nil {
- klog.Errorf("❌ [CONFIG] Error reloading config file: %v", err)
- configMutex.Unlock()
- continue
- }
- // 重新加载 Config 管理器
- cfg := Get()
- cfg.Reload()
- // 应用配置变更
- applyConfig(v, true)
- configMutex.Unlock()
- }
- }
- }
- }()
- }
- // watchCommonIni 使用轮询方式监控 common.ini 文件变化
- // 注意:RunInOmniagent 是启动时确定的标志,不支持热更新
- // 只有在启动时 RunInOmniagent 为 true 时,才会启动此监控
- func watchCommonIni(iniPath string) {
- klog.Infof("✓ [CONFIG] Starting polling watcher for common.ini: %s", iniPath)
- go func() {
- lastModTime := time.Now()
- // 初始化时获取文件的修改时间
- if info, err := os.Stat(iniPath); err == nil {
- lastModTime = info.ModTime()
- klog.Infof("✓ [CONFIG] Initial common.ini modTime: %v", lastModTime)
- }
- ticker := time.NewTicker(1 * time.Second)
- defer ticker.Stop()
- for {
- select {
- case <-ticker.C:
- info, err := os.Stat(iniPath)
- if err != nil {
- // 文件不存在或无法访问,跳过本次检查
- klog.Debugf("⏭️ [CONFIG] Cannot stat common.ini file: %v", err)
- continue
- }
- // 检查文件修改时间是否变化
- if info.ModTime().After(lastModTime) {
- lastModTime = info.ModTime()
- klog.Infof("🔔 [CONFIG] common.ini file changed detected by polling: %s (modTime: %v)", iniPath, lastModTime)
- configMutex.Lock()
- loadConfigFromCommonIni()
- configMutex.Unlock()
- }
- }
- }
- }()
- }
|