using System; using System.Collections.Generic; using Dapper; using MySql.Data.MySqlClient; using log4net; // 文件用途:从 CNC 系统配置表 cnc_sys_config 读取运行时配置,并覆盖默认 CollectorConfig 的设置 // 设计目标:在独立进程的采集服务中,不依赖仓储层,直接从数据库加载运行时参数 namespace CncCollector.Config { /// /// 运行时配置加载器:从 cnc_sys_config 表读取配置,覆盖 CollectorConfig 的默认值 /// public static class ConfigLoader { private static readonly ILog _log = LogManager.GetLogger(typeof(ConfigLoader)); /// /// 从数据库加载运行时配置并覆盖给定的 CollectorConfig 实例的默认值。 /// /// MySQL/MariaDB 连接字符串 /// 需要被覆盖的 CollectorConfig 实例(来自 CNC 采集服务) public static void LoadRuntimeConfig(string connectionString, CncModels.Entity.CollectorConfig config) { if (string.IsNullOrWhiteSpace(connectionString)) { _log.Warn("配置加载失败:连接字符串为空"); return; } if (config == null) { _log.Warn("配置加载失败:传入的 CollectorConfig 为 null"); return; } try { using (var conn = new MySqlConnection(connectionString)) { conn.Open(); // 需要加载的键集合 var keys = new[] { "collector_api_port", "collector_api_key", "heartbeat_interval", "config_poll_interval", "daily_summary_time", "collect_retry_count", "collect_retry_interval", "collect_fail_alert_threshold" }; foreach (var key in keys) { var value = conn.QueryFirstOrDefault( "SELECT config_value FROM cnc_sys_config WHERE config_key = @Key", new { Key = key }); if (value == null) continue; Apply(config, key, value); } } } catch (Exception ex) { _log.Error("加载运行时配置异常", ex); } } private static void Apply(CncModels.Entity.CollectorConfig config, string key, string value) { try { switch (key) { case "collector_api_port": SetIntProperty(config, nameof(config.ApiPort), value); break; case "collector_api_key": SetStringProperty(config, nameof(config.ApiKey), value); break; case "heartbeat_interval": SetIntProperty(config, nameof(config.HeartbeatInterval), value); break; case "config_poll_interval": SetIntProperty(config, nameof(config.ConfigPollInterval), value); break; case "daily_summary_time": SetTimeSpanProperty(config, nameof(config.DailySummaryTime), value); break; case "collect_retry_count": SetIntProperty(config, nameof(config.CollectRetryCount), value); break; case "collect_retry_interval": SetIntProperty(config, nameof(config.CollectRetryIntervalSeconds), value); break; case "collect_fail_alert_threshold": SetIntProperty(config, nameof(config.CollectFailAlertThreshold), value); break; } } catch { // 忽略单项配置解析失败,继续加载其他配置 } } private static void SetIntProperty(CncModels.Entity.CollectorConfig obj, string propName, string value) { if (obj == null) return; var p = obj.GetType().GetProperty(propName); if (p == null || !p.CanWrite) return; if (int.TryParse(value, out var v)) p.SetValue(obj, v); } private static void SetStringProperty(CncModels.Entity.CollectorConfig obj, string propName, string value) { if (obj == null) return; var p = obj.GetType().GetProperty(propName); if (p == null || !p.CanWrite) return; p.SetValue(obj, value); } private static void SetTimeSpanProperty(CncModels.Entity.CollectorConfig obj, string propName, string value) { if (obj == null) return; var p = obj.GetType().GetProperty(propName); if (p == null || !p.CanWrite) return; if (TimeSpan.TryParse(value, out var ts)) p.SetValue(obj, ts); } } }