如何在程序里动态加载配置文件
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); } } }
相关文章推荐
- #学习笔记#(55)sessionStorage/localStorage
- Java_chapter09_字符串和文本IO
- 2016年了
- Spring Security 学习笔记-securityContext过滤器过滤链学习
- java——类加载机制
- lua string库模式匹配
- IOS开发之获得当前的网速
- Oracle ORA-01033: 错误解决办法
- [python]爬极客网课程
- Attempting to badge the application icon but haven't received permiss
- 让button一直旋转 还能点击
- 【Android 多媒体开发】 MediaPlayer 状态机 接口 方法 解析
- android:stateNotNeeded
- Android相关属性的介绍:android:exported
- VS2013+SVN管理
- 向下之旅(十七):虚拟文件系统(一)
- 深度优先搜索和广度优先搜索
- 观察者模式
- AJAX XMLHttpRequest对象详解
- flume建立ElasticSearch索引时间的问题