上一节,我们认真的把debug环境搭建好了,下面开始慢慢的仔细的把代码研究下。
系统一开始就是进行配置文件读取,代码如下:
public static Props loadProps(String[] args, OptionParser parser) {
;
//配置初始化
OptionSpec<String> configDirectory =
parser
.acceptsAll(Arrays.asList("c", "conf"),
"The conf directory for Azkaban.").withRequiredArg()
.describedAs("conf").ofType(String.class);
// Grabbing the azkaban settings from the conf directory.
Props azkabanSettings = null;//默认为null
OptionSet options = parser.parse(args);//解析所有参数
//继续
if (options.has(configDirectory)) {//如果指定了配置目录
String path = options.valueOf(configDirectory);//获取指定的值
logger.info("Loading azkaban settings file from " + path);
File dir = new File(path);//文件以便判断
if (!dir.exists()) {
logger.error("Conf directory " + path + " doesn't exist.");
} else if (!dir.isDirectory()) {
logger.error("Conf directory " + path + " isn't a directory.");
} else {//确保存在且是目录
azkabanSettings = loadAzkabanConfigurationFromDirectory(dir);//读文件,取配置
}
} else {
logger
.info("Conf parameter not set, attempting to get value from AZKABAN_HOME env.");
azkabanSettings = loadConfigurationFromAzkabanHome();
}
return azkabanSettings;
}
这里面其实没什么难的,具体细节,读者也其实不用看
主要就是做了2件事情:
1)读取下面的2个文件
File azkabanPrivatePropsFile =
new File(dir, AZKABAN_PRIVATE_PROPERTIES_FILE);//"azkaban.private.properties"
File azkabanPropsFile = new File(dir, AZKABAN_PROPERTIES_FILE);//"azkaban.properties"
2)组织两个props形成父子关系,azkabanPrivatePropsFile 为父配置,另外一个为子配置,
父子关系如何指定呢?通过属性
private Props _parent;
接下来就立刻读取了2个属性,代码如下:
int maxThreads =
azkabanSettings.getInt("jetty.maxThreads", DEFAULT_THREAD_NUMBER);
boolean isStatsOn =
azkabanSettings.getBoolean("jetty.connector.stats", true);
logger.info("Setting up connector with stats on: " + isStatsOn);
这个本身不难,不过注意就是之前因为Props有个父子的关系,那么到底从父还是子文件中获取呢?
哪个的优先级高呢?
/**
* Return value if available in current Props otherwise return from parent
*
* @param key
* @return
*/
public String get(Object key) {
if (_current.containsKey(key)) {
return _current.get(key);
} else if (_parent != null) {
return _parent.get(key);
} else {
return nul
}
}
通过这段代码,就可以很清楚的看到,_current的优先级最高,然后才是_parent。
可以理解为金字塔的模式,底下的人能做的事,就不要麻烦上面的了。
这样一来,azkaban的配置读取就到底结束了,是不是很简单?