龙空技术网

「Spring Cloud Alibaba 系列」Nacos 长轮询任务

Java老油条 188

前言:

当前姐妹们对“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 轮询