CanalController.java
CanalController中和配置相关的代码:
public class CanalController {
// 默认使用spring的方式载入
// <destination,InstanceConfig>
private Map<String, InstanceConfig> instanceConfigs;
// 全局配置
private InstanceConfig globalInstanceConfig;
private Map<String, CanalConfigClient> managerClients;
// 监听instance config的变化
private boolean autoScan = true;
// 配置文件发生变化默认采取的action
private InstanceAction defaultAction;
// mode为spring或者manager
private Map<InstanceMode, InstanceConfigMonitor> instanceConfigMonitors;
// server核心逻辑,内嵌服务器
private CanalServerWithEmbedded embededCanalServer;
private CanalServerWithNetty canalServer;
}
上面这部分代码,有几个变量是和配置相关的,第一个就是instanceConfigs,这个变量中保存了每个instance对应的配置,读取的是配置文件instance.properties。
第二个是globalInstanceConfig,这个是server的全局配置,读取的是配置文件canal.properties。
第三个是autoScan,表示是否自动扫描配置文件。
第四个是defaultAction,这个表示在配置发生变化的情况,默认采取的措施。action现在内部有三个方法,第一个方法是
start(destination),当增加了instance会调用。第二个方法是stop(destination),当删除了instance会调用。第三个方法是reload(destination),表示instance的config内容发生变化时调用。
第五个是instanceConfigMonitors,根据不同的配置加载方式,有两种monitor。代码如下:
instanceConfigMonitors = MigrateMap.makeComputingMap(new Function<InstanceMode, InstanceConfigMonitor>() {
public InstanceConfigMonitor apply(InstanceMode mode) {
int scanInterval = Integer.valueOf(getProperty(properties, CanalConstants.CANAL_AUTO_SCAN_INTERVAL));
if (mode.isSpring()) {
SpringInstanceConfigMonitor monitor = new SpringInstanceConfigMonitor();
monitor.setScanIntervalInSecond(scanInterval);
monitor.setDefaultAction(defaultAction);
// 设置conf目录,默认是user.dir + conf目录组成
String rootDir = getProperty(properties, CanalConstants.CANAL_CONF_DIR);
if (StringUtils.isEmpty(rootDir)) {
rootDir = "../conf";
}
if (StringUtils.equals("otter-canal", System.getProperty("appName"))) {
monitor.setRootConf(rootDir);
} else {
// eclipse debug模式
monitor.setRootConf("src/main/resources/");
}
return monitor;
} else if (mode.isManager()) {
return new ManagerInstanceConfigMonitor();
} else {
throw new UnsupportedOperationException("unknow mode :" + mode + " for monitor");
}
}
});
我们看到上面代码,根据mode的不同,有两种monitor的实现方式,第一种是SpringInstanceConfigMonitor,第二种是ManagerInstanceConfigMonitor。我们主要看一下SpringInstanceConfigMonitor。