Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
 /// <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;
     }
 }