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

      

  • 相关阅读:
    调用Win32 API netapi32.dll 实现UNC(网络共享)连接的管理(一)
    一个重写Page基类的例子
    36进制进位算法例子
    关于.net 中调用script的alert后 css失效的办法
    Javascript:keyCode键码值表
    Url地址重写,利用HttpHander手工编译页面并按需生成静态HTML文件
    在.NET程序中正确使用String类型
    Sql Server中自动序号的方法
    托管和非托管的关系和区别
    Oracle 格式化
  • 原文地址:https://www.cnblogs.com/zhangwanhua/p/8365161.html
Copyright © 2011-2022 走看看