private void DoLongPollingRefresh(string appId, string cluster, string dataCenter) { Random random = new Random(); ServiceDTO lastServiceDto = null; while (!m_longPollingStopped.ReadFullFence()) { int sleepTime = 50; //default 50 ms try { if (lastServiceDto == null) { IList <ServiceDTO> configServices = ConfigServices; lastServiceDto = configServices[random.Next(configServices.Count)]; } string url = AssembleLongPollRefreshUrl(lastServiceDto.HomepageUrl, appId, cluster, dataCenter); logger.Debug( string.Format("Long polling from {0}", url)); Com.Ctrip.Framework.Apollo.Util.Http.HttpRequest request = new Com.Ctrip.Framework.Apollo.Util.Http.HttpRequest(url); //longer timeout - 10 minutes request.Timeout = 600000; HttpResponse <IList <ApolloConfigNotification> > response = m_httpUtil.DoGet <IList <ApolloConfigNotification> >(request); logger.Debug( string.Format("Long polling response: {0}, url: {1}", response.StatusCode, url)); if (response.StatusCode == 200 && response.Body != null) { UpdateNotifications(response.Body); Notify(lastServiceDto, response.Body); m_longPollSuccessSchedulePolicyInMS.Success(); } else { sleepTime = m_longPollSuccessSchedulePolicyInMS.Fail(); } //try to load balance if (response.StatusCode == 304 && random.NextDouble() >= 0.5) { lastServiceDto = null; } m_longPollFailSchedulePolicyInSecond.Success(); } catch (Exception ex) { lastServiceDto = null; int sleepTimeInSecond = m_longPollFailSchedulePolicyInSecond.Fail(); logger.Warn( string.Format("Long polling failed, will retry in {0} seconds. appId: {1}, cluster: {2}, namespace: {3}, reason: {4}", sleepTimeInSecond, appId, cluster, AssembleNamespaces(), ExceptionUtil.GetDetailMessage(ex))); sleepTime = sleepTimeInSecond * 1000; } finally { Thread.Sleep(sleepTime); } } }