rotateCheckConfigInfo 这是一个定时任务,循环调用
/**
* 循环探测配置信息是否变化,如果变化,则再次向DiamondServer请求获取对应的配置信息
*/
private void rotateCheckConfigInfo() {
scheduledExecutor.schedule(new Runnable() {
public void run() {
if (!isRun) {
log.warn("DiamondSubscriber不在运行状态中,退出查询循环");
return;
}
try {
checkLocalConfigInfo();
checkDiamondServerConfigInfo();
checkSnapshot();
}
catch (Exception e) {
e.printStackTrace();
log.error("循环探测发生异常", e);
}
finally {
rotateCheckConfigInfo();
}
}
}, bFirstCheck ? 20 : diamondConfigure.getPollingIntervalTime(), TimeUnit.SECONDS);
bFirstCheck = false;
}
1.从本地读取配置信息checkLocalConfigInfo
1.1 读取配置信息
String configInfo = getLocalConfigureInfomation(cacheData);
1.2 将订阅信息抛给客户的监听器
popConfigInfo(cacheData, configInfo);
1.2.1 核心代码
subscriberListener.receiveConfigInfo(configureInfomation);
//发送http请求到服务器获取订阅信息
//取得DefaultDiamondManager的ManagerListener,回调Listener
//并将结果抛给客户的监听器
saveSnapshot(dataId, group, configInfo);
//保存快照到本地
2 从服务器获取配置信息checkDiamondServerConfigInfo
2.1 从DiamondServer获取值变化了的DataID列表
Set<String> updateDataIdGroupPairs = checkUpdateDataIds(diamondConfigure.getReceiveWaitTime());
2.2 向DiamondServer请求dataId对应的配置信息,并将结果抛给客户的监听器 receiveConfigInfo。以下代码在线程池处理
String configInfo =getConfigureInfomation(cacheData.getDataId(), cacheData.getGroup(),diamondConfigure.getReceiveWaitTime(), true);
popConfigInfo(cacheData, configInfo);
2.2.1 getConfigureInfomation
String getConfigureInfomation(String dataId, String group, long timeout, boolean skipContentCache) //554行
2.2.1.1 start(); 又调用了一遍。getConfigureInfomation就是在start()里调用的,不明白了。注释掉也正常,因为取数据没有异常。
可能是重新初始化信息,不会使用过期的东西
2.2.1.2 缓存获取到直接返回
使用带有TTL的cache,
2.2.1.3 缓存获取不到从服务器获取,有重试次数
http请求:路径/diamond-server/config.co
- 200 getSuccess
获取配置信息,MD5校验,lastModifiedHeader等,放到本地缓存contentCache,设置新的消息轮询间隔时间 - 304 MD5校验 设置新的消息轮询间隔时间
- 404 删除本地快照
- 503 获取下一个服务器地址