上一节讲到,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);
}

  

archaius(2) 配置源的更多相关文章

  1. .NET Core采用的全新配置系统[5]: 聊聊默认支持的各种配置源[内存变量,环境变量和命令行参数]

    较之传统通过App.config和Web.config这两个XML文件承载的配置系统,.NET Core采用的这个全新的配置模型的最大一个优势就是针对多种不同配置源的支持.我们可以将内存变量.命令行参 ...

  2. .NET Core采用的全新配置系统[6]: 深入了解三种针对文件(JSON、XML与INI)的配置源

    物理文件是我们最常用到的原始配置的载体,最佳的配置文件格式主要由三种,它们分别是JSON.XML和INI,对应的配置源类型分别是JsonConfigurationSource.XmlConfigura ...

  3. 深入了解三种针对文件(JSON、XML与INI)的配置源

    深入了解三种针对文件(JSON.XML与INI)的配置源 物理文件是我们最常用到的原始配置的载体,最佳的配置文件格式主要由三种,它们分别是JSON.XML和INI,对应的配置源类型分别是JsonCon ...

  4. SpringBoot自动配置源码调试

    之前对SpringBoot的自动配置原理进行了较为详细的介绍(https://www.cnblogs.com/stm32stm32/p/10560933.html),接下来就对自动配置进行源码调试,探 ...

  5. CentOS配置源

    一.源列表 aliyun源 #各系统版本repo文件对应的下载操作 CentOS wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.al ...

  6. .Net Core 自定义配置源从配置中心读取配置

    配置,几乎所有的应用程序都离不开它..Net Framework时代我们使用App.config.Web.config,到了.Net Core的时代我们使用appsettings.json,这些我们再 ...

  7. [ASP.NET Core 3框架揭秘] 配置[7]:多样化的配置源[中篇]

    物理文件是我们最常用到的原始配置载体,而最佳的配置文件格式主要有三种,它们分别是JSON.XML和INI,对应的配置源类型分别是JsonConfigurationSource.XmlConfigura ...

  8. [ASP.NET Core 3框架揭秘] 配置[6]:多样化的配置源[上篇]

    .NET Core采用的这个全新的配置模型的一个主要的特点就是对多种不同配置源的支持.我们可以将内存变量.命令行参数.环境变量和物理文件作为原始配置数据的来源.如果采用物理文件作为配置源,我们可以选择 ...

  9. SpringBoot Profile使用详解及配置源码解析

    在实践的过程中我们经常会遇到不同的环境需要不同配置文件的情况,如果每换一个环境重新修改配置文件或重新打包一次会比较麻烦,Spring Boot为此提供了Profile配置来解决此问题. Profile ...

随机推荐

  1. unity探索者之socket传输protobuf字节流(四)

    版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/7027659.html 上篇已经把socket的传输说的差不多了,这篇主要是说说断线 ...

  2. Spring Boot系列(三):Spring Boot整合Mybatis源码解析

    一.Mybatis回顾 1.MyBatis介绍 Mybatis是一个半ORM框架,它使用简单的 XML 或注解用于配置和原始映射,将接口和Java的POJOs(普通的Java 对象)映射成数据库中的记 ...

  3. TypeScript 安装及基础运行环境搭建

    安装 TypeScript npm install -g typescript 安装成功后,命令行输入 tsc -v 命令提示当前安装的 TypeScript 版本: 出现版本号即安装成功. 使用 V ...

  4. JavaScript学习系列博客_35_JavaScript 正则表达式的使用

    正则表达式的使用 先说RegExp对象的一个方法 test() - 使用这个方法可以用来检查一个字符串是否符合正则表达式的规则,如果符合则返回true,否则返回false. 1.用正则表达式来检查一个 ...

  5. 文华财经赢顺外盘期货行情数据API接口开放代码

    文华财经赢顺外盘期货行情数据API接口开放代码        怎么才能获取到外盘期货行情数据API接口呢?不少朋友就会考虑到文华财经行情API接口,本身文华财经就是一个软件提供商,提供行情API接口也 ...

  6. git使用小结(本地分支与远程分支、git命令)

    git git 是一个版本管理系统(VCS),可以在任何时间点,将文档的状态作为一份更新记录保存起来,并且在任意的时间点,恢复更新记录 版本管理 版本管理是一种记录文件变化的方式,方便查阅特定版本号的 ...

  7. 百度官方给出的seo优化策略

    http://www.wocaoseo.com/thread-157-1-1.html 因为要参加seo工程师考试了,这两天一直在学习seo的基础理论,昨天也写了备战seo工程师考试的文章,说实在话, ...

  8. 【Android】Scrollview返回顶部,快速返回顶部的功能实现,详解代码。

    作者:程序员小冰,GitHub主页:https://github.com/QQ986945193 新浪微博:http://weibo.com/mcxiaobing 首先给大家看一下我们今天这个最终实现 ...

  9. C#还原对图像做的修改

    在C#程序中对图像进行处理,有的时候需要将处理后的图像还原,便于观察两者之间的区别,避免重新运行程序造成的麻烦.我是将之前写的Tab页中打开的图像进行还原,将原始图像数据保存在数据流中,然后从数据流中 ...

  10. oeasy教你玩转linux010104灵魂之问whatis

    灵魂之问whatis 回忆上节课 我们上次在系统里面乱转