• archaius(2) 配置源


      上一节讲到,archaius实现动态配置的核心就是定时去配置中心拉去配置内容,接下来几接就来看一下archaius内部具体是如何实现的。

      首先我们来了解一下配置源,什么是配置源呢,archaius内部配置的来源即配置源。archaius抽象了两种配置源,一种是主动拉取方式获取配置,一种是被动监听方式获取配置。

      所谓主动拉去就是配置源需要主动从目标位置获取配置;二被动监听则是注册一个监听器,当目标位置配置变换收接受变化的配置信息。

      我们先来看一下类图结构:

       PolledConfigurationSource定义了主动拉取配置的方法,并且支持断点加载。PollResult是拉取的结果数据。

    public PollResult poll(boolean initial, Object checkPoint) throws Exception;  

      initial是否是初次获取,checkPoint上次获取的检查点。

      archaius实现了JDBCConfigurationSource和URLConfigurationSource两种配置源分别从数据库和指定url中加载配置信息。   

      JDBCConfigurationSource 需要用户指定数据源,查询语句,key的列名,value的列名。

    public JDBCConfigurationSource(DataSource datasource, String query,
                String keyColumnName, String valueColumnName) {
            this.datasource = datasource;
            this.query = query;
            this.keyColumnName = keyColumnName;
            this.valueColumnName = valueColumnName;
        }

      根据数据源、查询语句、key的列名、value的列名从数据库中获取相应的配置,然后封装成PollResult返回,实际上JDBCConfigurationSource并没有实现断点加载,每一次获取都是获取所有数据。

    public PollResult poll(boolean initial, Object checkPoint) throws Exception {
            Map<String, Object> map = new HashMap<String, Object>();
            ...
                conn = getConnection();
                pstmt = conn.prepareStatement(query.toString());
                rs = pstmt.executeQuery();
                while (rs.next()) {
                    String key = (String) rs.getObject(keyColumnName);
                    Object value = rs.getObject(valueColumnName);
                    map.put(key, value);
                }
    
            ...
            return PollResult.createFull(map);
    }

      URLConfigurationSource需要指定配置文件的url(如果没有指定默认读取类路径下config.properties文件)。URLConfigurationSource也没有实现断点加载,每一次获取都是获取所有数据。

    public PollResult poll(boolean initial, Object checkPoint) throws IOException {    
      if (configUrls == null || configUrls.length == 0) {
         return PollResult.createFull(null);
       }
       Map<String, Object> map = new HashMap<String, Object>();
       for (URL url: configUrls) {
         InputStream fin = url.openStream();
          Properties props = ConfigurationUtils.loadPropertiesFromInputStream(fin);
          for (Entry<Object, Object> entry: props.entrySet()) {
            map.put((String) entry.getKey(), entry.getValue());
          }
       }
       return PollResult.createFull(map);
    }

    监听配置源

      WatchedConfigurationSource定义了监听配置源,当配置发生变化时,调用这些监听器,archaius内部并没有提供实现。

    public interface WatchedConfigurationSource {
        /**增加监听器
         */
        public void addUpdateListener(WatchedUpdateListener l);
        /**删除监听器
         */
        public void removeUpdateListener(WatchedUpdateListener l);
        /**获取最新的所有配置信息
         */
        public Map<String, Object> getCurrentData() throws Exception;
    }

      WatchedUpdateListener定义了监听器,

    public interface WatchedUpdateListener {
        public void updateConfiguration(WatchedUpdateResult result);
    }

      WatchedUpdateResult里面是改动的配置信息。

    public class WatchedUpdateResult {
      /**分别存储完整的配置信息,新增的配置,改变的配置,删除的配置 */
    protected final Map<String, Object> complete, added, changed, deleted; protected final boolean incremental; /**完整的配置信息*/ public static WatchedUpdateResult createFull(Map<String, Object> complete) { return new WatchedUpdateResult(complete); }

      

  • 相关阅读:
    flutter item列表左右滑动带出按钮选项
    flutter之Dismissible组件
    mac下最好用的抓包工具--charles简单操作教程
    flutter 开起charles抓包代理
    nodejs querystring模块
    node.js 中使用 Mongodb
    MongoDB 的高级查询 aggregate 聚合管道
    Mongodb 关系型数据库表(集合)与表(集合)之 间的几种关系
    Mongodb 的使用以及 Mongodb 账户权 限配置
    MongoDb 大数据查询优化、 MongoDB 索引、复合索引、唯一索引、 explain 分 析查询速度
  • 原文地址:https://www.cnblogs.com/zhangwanhua/p/8365161.html
Copyright © 2020-2023  润新知