您的位置:首页 > 其它

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

2016-03-28 15:18 435 查看
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);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: