Azkaban的Web Server源码探究系列2: 配置文件读取过程分析

上一节,我们认真的把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的配置读取就到底结束了,是不是很简单?

你可能感兴趣的:(azkaban)