private void RefreshAndInitFiles(string zkHosts, IEnumerable <string> files) { if (files != null) { IZkTreeBuilder fileBuilder = new ZkFileTreeBuilder(config.ClientInfo.AppName, config.ClientInfo.Version, config.ClientInfo.Environment); foreach (var file in files) { fileBuilder.GetOrAddZnodeName(file); this._handler.Execute(() => { if (!config.UpdateStrategy.FileIgnoreList.Contains(file)) { //对于文件类型,如果本地没配置过Rule规则,则采用默认规则,即将文件复制到实际位置,然后RefreshSection配置对应的文件名 this.FileRules.For(file); this.FileRules.ConfigChanged(file, null); } }, string.Format("Some thing is wrong with file '{0}'", file));//除了外部包含保证Exception不会导致程序异常,方法内部同样需要保证单次异常不会导致其它监控流程失败 } if (!string.IsNullOrWhiteSpace(zkHosts)) { this._fileWatcher = new NodeWatcher(zkHosts, 30000, fileBuilder, config.ClientInfo.ClientName); this._fileWatcher.NodeChanged += _fileWatcher_NodeChanged; } } }
private void GetAllConfigs() { IEnumerable <string> files; IDictionary <string, string> items; FetchManager.Instance.GetAllConfigs(out files, out items); string zkHosts = FetchManager.Instance.GetZookeeperHosts(); if (files != null) { IZkTreeBuilder fileBuilder = new ZkFileTreeBuilder(config.ClientInfo.AppName, config.ClientInfo.Version, config.ClientInfo.Environment); foreach (var file in files) { fileBuilder.GetOrAddZnodeName(file); this.FileRules.For(file); this.FileRules.ConfigChanged(file, null); } this._fileWatcher = new NodeWatcher(zkHosts, 30000, fileBuilder); this._fileWatcher.NodeChanged += _fileWatcher_NodeChanged; } if (items != null) { IZkTreeBuilder itemBuilder = new ZkItemTreeBuilder(config.ClientInfo.AppName, config.ClientInfo.Version, config.ClientInfo.Environment); foreach (var item in items.Keys) { itemBuilder.GetOrAddZnodeName(item); this.ItemRules.ConfigChanged(item, items[item]); } this._itemWatcher = new NodeWatcher(zkHosts, 30000, itemBuilder); this._itemWatcher.NodeChanged += _itemWatcher_NodeChanged;; } }
private async Task AddWatcher(params IZkTreeBuilder[] builders) { var signatureData = new SignatureData { HashAlgorithm = this._setting.Security.HashAlgorithm }; signatureData.SetSecretKey(this._setting.Security.SecretKey); var zkHost = await this._fetcher.GetZkHosts(signatureData).ConfigureAwait(false); this._watcher = new NodeWatcher(zkHost, this._setting.ZookeeperSessionTimeout, this._setting.ClientInfo.ClientIdentity, builders); this._watcher.NodeChanged += Watcher_NodeChanged; this._watcher.StartConnect(); }
/// <summary> /// 刷新键值对 /// </summary> /// <param name="zkHosts"></param> /// <param name="items"></param> private void RefreshAndInitItems(string zkHosts, IDictionary <string, string> items) { if (items != null) { var itemBuilder = new ZkItemTreeBuilder(config.ClientInfo.AppName, config.ClientInfo.Version, config.ClientInfo.Environment); foreach (var itemName in items.Keys) { itemBuilder.GetOrAddZnodeName(itemName); ItemWatcher_NodeChanged(itemName); } if (!string.IsNullOrWhiteSpace(zkHosts)) { _itemWatcher = new NodeWatcher(zkHosts, 30000, itemBuilder, config.ClientInfo.ClientName); _itemWatcher.NodeChanged += ItemWatcher_NodeChanged; } } }
/// <summary> /// 刷新文件配置 /// </summary> /// <param name="zkHosts"></param> /// <param name="files"></param> private void RefreshAndInitFiles(string zkHosts, IEnumerable <string> files) { if (files != null) { var fileBuilder = new ZkFileTreeBuilder(config.ClientInfo.AppName, config.ClientInfo.Version, config.ClientInfo.Environment); foreach (var configName in files) { fileBuilder.GetOrAddZnodeName(configName); FileRules.For(configName).MapTo(configName); FileWatcher_NodeChanged(configName); } if (!string.IsNullOrWhiteSpace(zkHosts)) { _fileWatcher = new NodeWatcher(zkHosts, 30000, fileBuilder, config.ClientInfo.ClientName); _fileWatcher.NodeChanged += FileWatcher_NodeChanged; } } }
public virtual async Task WatchedByAsync(NodeWatcher watcher) { if (watcher == null) { throw new ArgumentNullException(nameof(watcher)); } _watcher = watcher; //说明:如果znode存在,则会注册一个existWatch, 反之则会注册一个dataWatch _stat = await Connection.existsAsync(Path, _watcher).ConfigureAwait(false); //如果znode已经存在,则直接监控其children if (_stat != null) { await WatchChildrenAsync(_watcher).ConfigureAwait(false); } ////znode被删除时,会丢失对children的监控 //NodeCreated += async (_, __) => //{ // await WatchChildrenAsync(watcher).ConfigureAwait(false); //}; }
private void RefreshAndInitItems(string zkHosts, IDictionary <string, string> items) { if (items != null) { IZkTreeBuilder itemBuilder = new ZkItemTreeBuilder(config.ClientInfo.AppName, config.ClientInfo.Version, config.ClientInfo.Environment); foreach (var item in items.Keys) { itemBuilder.GetOrAddZnodeName(item); this._handler.Execute(() => { if (!config.UpdateStrategy.ItemIgnoreList.Contains(item)) { //键值对必须配置本地规则,否则无法处理 this.ItemRules.ConfigChanged(item, items[item]); } }, string.Format("Some thing is wrong with item '{0}'", item)); } if (!string.IsNullOrWhiteSpace(zkHosts)) { this._itemWatcher = new NodeWatcher(zkHosts, 30000, itemBuilder, config.ClientInfo.ClientName); this._itemWatcher.NodeChanged += _itemWatcher_NodeChanged; } } }
/// <summary> /// 同步zookeeper服务并序列化成配置文件到本地 /// 初始化 /// </summary> public void InitClient() { var task = Task.Run(() => { this._handler.Execute(() => { StringBuilder logBuilder = new StringBuilder(); #region 步配置到本地 if (!Directory.Exists(ClientPath)) { Directory.CreateDirectory(ClientPath); } logBuilder.AppendLine("同步zookeeper数据到本地\r\n"); using (MaintainWatcher mk = new MaintainWatcher(config.Host, 1000)) { ZooKeeper zk = mk.ZooKeeper; //本地站点的名称 string name = config.ClientInfo.AppName; var stat = zk.Exists($"/{name}", false); if (stat == null) { return; } if (!System.IO.Directory.Exists(Path.Combine(ClientPath, name))) { System.IO.Directory.CreateDirectory(Path.Combine(ClientPath, name)); } var children = zk.GetChildren($"/{name}", false);//取不到节点会报错 foreach (var child in children) { stat = new Stat(); var tmpdata = zk.GetData($"/{name}/{child}", false, stat); string tmpString = System.Text.Encoding.UTF8.GetString(tmpdata); ZNode znode = Deserialize(tmpString); if (znode == null) { continue; } znode.Version = stat.Version; //看下本地的配置文件版本号,需要不需要更新 string file = Path.Combine(ClientPath, name, child + ".txt"); string text = FileHelper.ReadFile(file); ZNode zLocal = Deserialize(text); if (zLocal == null || zLocal.Version < znode.Version) { FileHelper.WriteFile(file, znode.ToString()); logBuilder.AppendLine($"下载节点:{$"/{name}/{child}"},值:{JsonHelper.ToNewtonJsonString(znode)}"); } } } #endregion #region 加载配置到内存 var files = Directory.GetFiles(Path.Combine(ClientPath, config.ClientInfo.AppName), "*.txt"); IZkTreeBuilder itemBuilder = new ZkTreeBuilder(config.ClientInfo.AppName); foreach (string file in files) { string key = Path.GetFileNameWithoutExtension(file); string text = FileHelper.ReadFile(file); ZNode znode = Deserialize(text); if (znode == null) { continue; } itemBuilder.GetOrAddZnodeName($"/{config.ClientInfo.AppName}/{key}", znode.Value); } this._itemWatcher = new NodeWatcher(config.Host, 30000, itemBuilder); this._itemWatcher.NodeChanged += _itemWatcher_NodeChanged; #endregion LogHelper.WriteCustom(logBuilder.ToString(), "zookeeper\\", false); }, string.Empty); }); task.Wait(); }
/// <summary> /// 监控路径,监控前会事先创建路径,并且会新建一个自己的Temp子结点 /// </summary> //JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET: //ORIGINAL LINE: public void watchPath(com.baidu.disconf.client.core.processor.DisconfCoreProcessor disconfCoreMgr, com.baidu.disconf.client.common.model.DisConfCommonModel disConfCommonModel, String keyName, com.baidu.disconf.core.common.constants.DisConfigTypeEnum disConfigTypeEnum, String value) throws Exception public virtual void watchPath(DisconfCoreProcessor disconfCoreMgr, DisConfCommonModel disConfCommonModel, string keyName, DisConfigTypeEnum disConfigTypeEnum, string value) { // 新建 string monitorPath = makeMonitorPath(disConfigTypeEnum, disConfCommonModel, keyName, value); // 进行监控 NodeWatcher nodeWatcher = new NodeWatcher(disconfCoreMgr, monitorPath, keyName, disConfigTypeEnum, new DisconfSysUpdateCallback(), debug); nodeWatcher.monitorMaster(); }