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并没有实现断点加载,每一次获取都是获取所有数据。
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); }