/// <summary> /// 注册监控关系,并返回在注册监控之前变更过的znode完整路径对应的configName /// </summary> public IEnumerable <string> RegisterWatcher() { var configs = new HashSet <string>(); if (_builder != null) { long mtime = _mtime; var znodes = _builder.GetAllZnodes(); foreach (var node in znodes) { var path = _builder.GetZkPath(node); try { var stat = ZooKeeper.Exists(path, true); if (stat != null) { if (_mtime > 0 && stat.Mtime > _mtime) { //通过_mtime是否大于0进行判断是第一次还是Expired后重连,只有重连时才需要返回变更过的节点 configs.Add(_builder.GetConfigName(node)); } ZooKeeper.AddTmpChildNode(path, _clientName); mtime = Math.Max(mtime, stat.Mtime); } } catch (Exception) { //TODO:可能需要判断Expired } } _mtime = mtime; } return(configs); }
/// <summary> /// 监控进程 /// </summary> /// <param name="event"></param> public override void Process(WatchedEvent @event) { base.Process(@event); switch (@event.Type) { case EventType.NodeDataChanged: var path = @event.Path; if (NodeChanged != null && !string.IsNullOrWhiteSpace(path)) { NodeChanged(_builder.GetConfigName(Path.GetFileName(path))); try { //重新注册监控 //这里可能会存在Expired问题 var stat = ZooKeeper.Exists(path, true); ZooKeeper.AddTmpChildNode(path, _clientName); //按正常逻辑,最后更新的节点,mtime肯定比目前记录的mtime大,所以这里不进行Math.Max处理 _mtime = stat.Mtime; } catch (Exception) { //TODO:可能需要判断Expired } } break; } }