示例#1
0
        public async Task <List <Instance> > GetAllInstances(string serviceName, string groupName, List <string> clusters, bool subscribe)
        {
            ServiceInfo serviceInfo;
            string      clusterString = string.Join(",", clusters);

            if (subscribe)
            {
                serviceInfo = _serviceInfoHolder.GetServiceInfo(serviceName, groupName, clusterString);
                if (serviceInfo == null)
                {
                    serviceInfo = await _clientProxy.Subscribe(serviceName, groupName, clusterString).ConfigureAwait(false);
                }
            }
            else
            {
                serviceInfo = await _clientProxy.QueryInstancesOfService(serviceName, groupName, clusterString, 0, false).ConfigureAwait(false);
            }

            List <Instance> list = serviceInfo.Hosts;

            if (serviceInfo == null || serviceInfo.Hosts == null || !serviceInfo.Hosts.Any())
            {
                return(new List <Instance>());
            }

            return(list);
        }
        private async Task RunUpdateTask(string serviceName, string groupName, string clusters)
        {
            int delayTime  = -1;
            var serviceKey = ServiceInfo.GetKey(NamingUtils.GetGroupedName(serviceName, groupName), clusters);

            try
            {
                if (!changeNotifier.IsSubscribed(groupName, serviceName, clusters) && !_updatingMap.ContainsKey(serviceKey))
                {
                    // TODO logger
                    return;
                }

                if (!serviceInfoHolder.GetServiceInfoMap().TryGetValue(serviceKey, out var serviceObj))
                {
                    serviceObj = await namingClientProxy.QueryInstancesOfService(serviceName, groupName, clusters, 0, false);

                    serviceInfoHolder.ProcessServiceInfo(serviceObj);
                    delayTime = DEFAULT_DELAY;

                    // TODO lastRefTime serviceObj.LastRefTime
                    return;
                }

                if (serviceObj.LastRefTime <= 0)
                {
                    serviceObj = await namingClientProxy.QueryInstancesOfService(serviceName, groupName, clusters, 0, false);

                    serviceInfoHolder.ProcessServiceInfo(serviceObj);
                }

                // TODO lastRefTime serviceObj.LastRefTime
                if (serviceObj.Hosts == null || serviceObj.Hosts.Any())
                {
                    // incFailCount
                    return;
                }

                delayTime = (int)serviceObj.CacheMillis * DEFAULT_UPDATE_CACHE_TIME_MULTIPLE;

                // resetFailCount
            }
            catch (System.Exception)
            {
                // logger
            }
            finally
            {
                // next
            }
        }