watcher.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package config
  2. import (
  3. "os"
  4. "time"
  5. klog "github.com/sirupsen/logrus"
  6. "github.com/spf13/viper"
  7. )
  8. // startConfigFileWatcher 启动配置文件轮询监听
  9. func startConfigFileWatcher(configFile string, v *viper.Viper) {
  10. if configFile == "" {
  11. klog.Warnf("⚠️ [CONFIG] ConfigFileUsed() returned empty string, cannot start polling watcher")
  12. return
  13. }
  14. klog.Infof("✓ [CONFIG] Starting polling watcher for: %s", configFile)
  15. go func() {
  16. lastModTime := time.Now()
  17. // 初始化时获取文件的修改时间
  18. if info, err := os.Stat(configFile); err == nil {
  19. lastModTime = info.ModTime()
  20. klog.Infof("✓ [CONFIG] Initial file modTime: %v", lastModTime)
  21. }
  22. ticker := time.NewTicker(1 * time.Second)
  23. defer ticker.Stop()
  24. for {
  25. select {
  26. case <-ticker.C:
  27. info, err := os.Stat(configFile)
  28. if err != nil {
  29. // 文件不存在或无法访问,跳过本次检查
  30. klog.Debugf("⏭️ [CONFIG] Cannot stat config file: %v", err)
  31. continue
  32. }
  33. // 检查文件修改时间是否变化
  34. if info.ModTime().After(lastModTime) {
  35. lastModTime = info.ModTime()
  36. klog.Infof("🔔 [CONFIG] Config file changed detected by polling: %s (modTime: %v)", configFile, lastModTime)
  37. configMutex.Lock()
  38. // 重新加载配置
  39. if err := v.ReadInConfig(); err != nil {
  40. klog.Errorf("❌ [CONFIG] Error reloading config file: %v", err)
  41. configMutex.Unlock()
  42. continue
  43. }
  44. // 重新加载 Config 管理器
  45. cfg := Get()
  46. cfg.Reload()
  47. // 应用配置变更
  48. applyConfig(v, true)
  49. configMutex.Unlock()
  50. }
  51. }
  52. }
  53. }()
  54. }
  55. // watchCommonIni 使用轮询方式监控 common.ini 文件变化
  56. // 注意:RunInOmniagent 是启动时确定的标志,不支持热更新
  57. // 只有在启动时 RunInOmniagent 为 true 时,才会启动此监控
  58. func watchCommonIni(iniPath string) {
  59. klog.Infof("✓ [CONFIG] Starting polling watcher for common.ini: %s", iniPath)
  60. go func() {
  61. lastModTime := time.Now()
  62. // 初始化时获取文件的修改时间
  63. if info, err := os.Stat(iniPath); err == nil {
  64. lastModTime = info.ModTime()
  65. klog.Infof("✓ [CONFIG] Initial common.ini modTime: %v", lastModTime)
  66. }
  67. ticker := time.NewTicker(1 * time.Second)
  68. defer ticker.Stop()
  69. for {
  70. select {
  71. case <-ticker.C:
  72. info, err := os.Stat(iniPath)
  73. if err != nil {
  74. // 文件不存在或无法访问,跳过本次检查
  75. klog.Debugf("⏭️ [CONFIG] Cannot stat common.ini file: %v", err)
  76. continue
  77. }
  78. // 检查文件修改时间是否变化
  79. if info.ModTime().After(lastModTime) {
  80. lastModTime = info.ModTime()
  81. klog.Infof("🔔 [CONFIG] common.ini file changed detected by polling: %s (modTime: %v)", iniPath, lastModTime)
  82. configMutex.Lock()
  83. loadConfigFromCommonIni()
  84. configMutex.Unlock()
  85. }
  86. }
  87. }
  88. }()
  89. }