diamond源码阅读-循环探测配置信息是否变化rotateCheckConfigInfo

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 获取下一个服务器地址

3 检查本地快照,从本地快照获取信息checkSnapshot,触发监听器

4 重复以上过程,循环检测rotateCheckConfigInfo();

posted @ 2016-10-26 16:10  穿林度水  阅读(680)  评论(0编辑  收藏  举报