zoukankan      html  css  js  c++  java
  • 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();

  • 相关阅读:
    BZOJ2144跳跳棋——LCA+二分
    BZOJ[Usaco2017 Jan]Promotion Counting——线段树合并
    BZOJ4551[Tjoi2016&Heoi2016]树——dfs序+线段树/树链剖分+线段树
    BZOJ1559[JSOI2009]密码——AC自动机+DP+搜索
    BZOJ1222[HNOI2001]产品加工——DP
    [IOI2018]狼人——kruskal重构树+可持久化线段树
    BZOJ3091城市旅行——LCT区间信息合并
    Link-Cut Tree(LCT)&TopTree讲解
    BZOJ3669[Noi2014]魔法森林——kruskal+LCT
    BZOJ4530[Bjoi2014]大融合——LCT维护子树信息
  • 原文地址:https://www.cnblogs.com/clds/p/6000771.html
Copyright © 2011-2022 走看看