如何在程序里动态加载配置文件

来源:互联网 发布:java行业前景怎么样 编辑:程序博客网 时间:2024/04/28 01:33

flume的sink进程或者kafka的consumer进程,特定的时候需要读取配置文件,如提取指定的字段或过滤指定字段等。这种情况,若没有动态加载,则需要需改代码或配置文件,重启进程方能生效,十分不利于维护。最好的办法是让进程去监控配置文件的改动,然后动态的去读取其中的内容并应用到进程中去,从而达到动态修改。

方案就是启动一个单独线程去监控配置文件的最后修改时间,若发现有改动则重新加载。

代码如下:

public class ReloadThread extends Thread {  private static final Logger log = LoggerFactory.getLogger(ReloadThread.class);  private long lastSuccessfulReload;  private File configureFile;  public List<String> selectedFields;  public ReloadThread(File configureFile) {    this.configureFile = configureFile;    selectedFields = new ArrayList<String>();  }  public String getSelectedFields() {    StringBuilder sb = new StringBuilder();    for (String item : selectedFields) {      sb.append(item).append(",");    }    if (sb.length() > 0) {      return (sb.substring(0, sb.length() - 1));    } else {      return "";    }  }  @Override  public void run() {    while (true) {      long time = System.currentTimeMillis();      long lastModified = configureFile.lastModified();      if (lastModified > lastSuccessfulReload          && time > lastModified + KafkaUtil.ALLOC_RELOAD_WAIT_MS) {        try {          synchronized (selectedFields) {            reloadConfigureFile(configureFile);            log.info("Reload configuration file: " + getSelectedFields());            lastSuccessfulReload = System.currentTimeMillis();          }        } catch (Exception ex) {          log.error(              "Failed to reload config file - will use existing configuration.",              ex);        }      }    }  }  public void reloadConfigureFile(File configureFile) {    try {      /** 判断文件是否存在 */      if (configureFile.isFile() && configureFile.exists()) {        InputStreamReader read = new InputStreamReader(            new FileInputStream(configureFile));        BufferedReader bufferedReader = new BufferedReader(read);        String line;        while ((line = bufferedReader.readLine()) != null) {          if (!selectedFields.contains(line)) {            selectedFields.add(line);          }        }        read.close();      } else {        log.error("Failed to find file:" + configureFile.getAbsolutePath());      }    } catch (Exception e) {      log.error("Failed to read file:" + configureFile.getAbsolutePath(), e);    }  }}


0 0
原创粉丝点击