private Timer LongPolling(int taskId) { return(new Timer( async x => { var cacheDatas = new List <CacheData>(); var inInitializingCacheList = new List <string>(); int selfTaskId = -1; int.TryParse(x.ToString(), out selfTaskId); try { foreach (var cacheData in _cacheMap.Values) { // no listener should stop here. if (cacheData.TaskId == selfTaskId && cacheData.GetListeners() != null && cacheData.GetListeners().Any()) { cacheDatas.Add(cacheData); try { await CheckLocalConfig(_agent.GetName(), cacheData); if (cacheData.IsUseLocalConfig) { cacheData.CheckListenerMd5(); } } catch (Exception ex) { _logger?.LogError(ex, "get local config info error"); } } } var changedGroupKeys = await CheckUpdateDataIds(cacheDatas, inInitializingCacheList); foreach (string groupKey in changedGroupKeys) { string[] key = GroupKey.ParseKey(groupKey); string dataId = key[0]; string group = key[1]; string tenant = null; if (key.Length == 3) { tenant = key[2]; } try { List <string> ct = await GetServerConfig(dataId, group, tenant, 3000L, true); if (_cacheMap.TryGetValue(GroupKey.GetKeyTenant(dataId, group, tenant), out var cache)) { cache.SetContent(ct[0]); if (ct[1] != null) { cache.Type = ct[1]; } _logger?.LogInformation("[{0}] [data-received] dataId={1}, group={2}, tenant={3}, md5={4}, content={5}, type={6}", _agent.GetName(), dataId, group, tenant, cache.Md5, ContentUtils.TruncateContent(ct[0]), ct[1]); } } catch (Exception ioe) { _logger?.LogError(ioe, "[{0}] [get-update] get changed config exception. dataId={0}, group={2}, tenant={3}", _agent.GetName(), dataId, group, tenant); } } foreach (var cacheData in cacheDatas) { if (!cacheData.IsInitializing || inInitializingCacheList.Contains(GroupKey.GetKeyTenant(cacheData.DataId, cacheData.Group, cacheData.Tenant))) { cacheData.CheckListenerMd5(); cacheData.IsInitializing = false; } } inInitializingCacheList.Clear(); if (_longPollingMap.TryGetValue(selfTaskId, out var t)) { t.Change(1, Timeout.Infinite); } } catch (Exception ex) { _logger?.LogError(ex, "longPolling error"); if (_longPollingMap.TryGetValue(selfTaskId, out var t)) { t.Change(_taskPenaltyTime, Timeout.Infinite); } } }, taskId, 0, Timeout.Infinite)); }
private Timer LongPolling(int taskId) { return(new Timer(async x => { var cacheDatas = new List <CacheData>(); var inInitializingCacheList = new List <string>(); int selfTaskId = -1; int.TryParse(x.ToString(), out selfTaskId); try { foreach (var cacheData in _cacheMap.Values) { if (cacheData.TaskId == selfTaskId) { cacheDatas.Add(cacheData); try { CheckLocalConfig(cacheData); if (cacheData.IsUseLocalConfig) { cacheData.CheckListenerMD5(); } } catch (Exception ex) { _logger.Error(ex, "get local config info error"); } } } var changedGroupKeys = await CheckUpdateDataIds(cacheDatas, inInitializingCacheList); foreach (string groupKey in changedGroupKeys) { string[] key = GroupKey.ParseKey(groupKey); string dataId = key[0]; string group = key[1]; string tenant = null; if (key.Length == 3) { tenant = key[2]; } try { string content = await GetServerConfig(dataId, group, tenant); CacheData cache = null; if (_cacheMap.TryGetValue(GroupKey.GetKeyTenant(dataId, group, tenant), out cache)) { cache.Content = content; _logger.Info($"[{_agent.GetName()}] [data-received] dataId={dataId}, group={group}, tenant={tenant}, md5={cache.MD5}, content={ContentUtils.TruncateContent(content)}"); } } catch (Exception ex) { _logger.Error(ex, $"[{_agent.GetName()}] [get-update] get changed config exception. dataId={dataId}, group={group}, tenant={tenant}"); } } foreach (var cacheData in cacheDatas) { if (!cacheData.IsInitializing || inInitializingCacheList.Contains(GroupKey.GetKeyTenant(cacheData.DataId, cacheData.Group, cacheData.Tenant))) { cacheData.CheckListenerMD5(); cacheData.IsInitializing = false; } } inInitializingCacheList.Clear(); Timer t = null; if (_longPollingMap.TryGetValue(selfTaskId, out t)) { t.Change(1, Timeout.Infinite); } } catch (Exception ex) { _logger.Error(ex, "longPolling error"); Timer t = null; if (_longPollingMap.TryGetValue(selfTaskId, out t)) { t.Change(_taskPenaltyTime, Timeout.Infinite); } } }, taskId, 0, Timeout.Infinite)); }