前言:
当前姐妹们对“java 轮询”可能比较珍视,各位老铁们都需要分析一些“java 轮询”的相关文章。那么小编在网上汇集了一些有关“java 轮询””的相关资讯,希望看官们能喜欢,同学们一起来学习一下吧!长轮询任务
每个长轮询LongPollingRunnable任务处理3000个监听配置集,如果超过3000个,则需要启动多个LongPollingRunnable去执行。
LongPollingRunnable.run
LongPollingRunnable是一个线程,找到LongPollingRunnable方法
通过checkLocalConfig方法检查本地配置。执行checkUpdateDataIds方法和在服务器建立长轮询机制,从服务端获取发生修改的数据遍历修改数据集合changedGroupKeys,调用getServerConfig方法,根据dataId、Group、
Tenant去服务器读取对应的配置信息并保存到本地文件。
public void run(){List<CacheData> cacheDatas=new ArrayList<CacheData>();List<String> inInitializingCacheList = new ArrayList<String>(); try{ for(CacheData cacheData:cacheMap.get().values()){ if(cahceData.getTaskId() == taskId){ cahceDatas.add(cacheData); } try{ checkLocalConfig(cacheData); if(cacheData.isUseLocalConfigInfo()){ cahceData.checkListenerMd5(); } }catch(Exception e){ LOGGER.error("get local config info error",e); } } } List<String> changeGroupKeys = checkUpdateDataIds(cacheDatas,inInitalizingCacheList); for(String groupKey:changedGroupKeys){ String[] keysGroupKey.parseKey(groupKey); String dataId = key[0]; String group = key[1]; String tenant = null; if(key.length == 3){ tenant = key[2]; } try{ String content = getServerClient(dataId,group,tenant,3000L); CacheData cache = cacheMap.get().get(GroupKey.getKeyTenant(dataId,group,tenant)); cache.setContent(content); LOGGER.info("[{}][data-received] dataId = {},group={},tenant={},md5={},content={}",agent.getName(),dataId,group,tenant); LOGGER.error(message,ice); } } for(CacheData cacheData:cacheDatas){ if(!cacheData.isInitializing() || inInitializingCacheList.contais(GroupKey.getKeyTenant(cacheData.dataId,cahceData.group,cacheData.tenant))){ cacheData.checkListenerMd5(); cacheData.setInitializing(false); } } inInitializingCahceList.clear(); //继续定时执行当前线程 executorService.execute(this);}catch(Throwable e){ LOGGER.error("longPolling error:",e); executorService.schedule(this,taskPenaltyTime,TimeUnit.MILLISECONDS);}复制代码
根据taskId对cacheMap进行数据分割,再比较本地配置文件的数据是否存在变更,如果有修改,则直接触发通知。注意的是在${user}/nacos/config/目录下缓存一份服务端的配置信息,checkLocalConfig和本地磁盘中的文件内容进行比较,如果内存中的数据和磁盘中的数据不一致说明数据发生了变化,需要触发事件通知。
作者:Gxin
链接:
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
标签: #java 轮询