FileChangedReloadingStrategy什么鬼?
2015-07-14 00:00
316 查看
摘要: commons-configuration基于FileChangedReloadingStrategy的配置文件变化重载触发机制,无法自动触发configurationChanged事件
背景:项目中使用了common-configuration库用于加载配置文件,并通过扩展的ConfigManager实现统一的配置管理。
现象:考虑到有些配置信息可以通过热加载的方式,不用重启服务器进行更新。commons-configuration提供了ReloadingStrategy和ConfigurationListener,示例代码如下,通过RELOAD事件做实时的属性更新操作,然而系统跑起来之后,修改文件并未监控到该事件的产生。
分析:首先排除apache的弱智,在该段代码后,起一个独立线程,每隔1秒打印一下目标属性的值,看是否成功reload。结果发现不仅成功reload,ConfigurationEvent也产生的,Changed执行了,什么鬼?去掉线程后,又是老样子。网上搜索毫无结果,最后只能到apache官网找原因,并最终找到如下描述: FileChangedReloadingStrategy works as follows: On every property access the configuration checks its associated reloading strategy.
居然是在属性访问的时候才check?要不访问那listener不就毫无用处?!access的时候重载不还要做并发控制,要加锁,虽然配置文件读一下很快,不也影响体验?
解决方案:
1.X版本只能自己另外创建个线程调用get方法以触发property的access,进而触发configurationChanged。
2.X版本新增了一个PeriodicReloadingTrigger来解决此问题,它会起一个ScheduledExecutorService,通过线程方式来处理
背景:项目中使用了common-configuration库用于加载配置文件,并通过扩展的ConfigManager实现统一的配置管理。
现象:考虑到有些配置信息可以通过热加载的方式,不用重启服务器进行更新。commons-configuration提供了ReloadingStrategy和ConfigurationListener,示例代码如下,通过RELOAD事件做实时的属性更新操作,然而系统跑起来之后,修改文件并未监控到该事件的产生。
PropertiesConfiguration config = new PropertiesConfiguration(configFile); FileChangedReloadingStrategy strategy = new FileChangedReloadingStrategy(); config.setReloadingStrategy(strategy); config.addConfigurationListener(new ConfigurationListener() { @Override public void configurationChanged(ConfigurationEvent e) { System.out.println("配置文件更新..."+e.getType()); if(PropertiesConfiguration.EVENT_RELOAD ==e.getType()) { System.out.println("配置文件重载..."); } } });
分析:首先排除apache的弱智,在该段代码后,起一个独立线程,每隔1秒打印一下目标属性的值,看是否成功reload。结果发现不仅成功reload,ConfigurationEvent也产生的,Changed执行了,什么鬼?去掉线程后,又是老样子。网上搜索毫无结果,最后只能到apache官网找原因,并最终找到如下描述: FileChangedReloadingStrategy works as follows: On every property access the configuration checks its associated reloading strategy.
居然是在属性访问的时候才check?要不访问那listener不就毫无用处?!access的时候重载不还要做并发控制,要加锁,虽然配置文件读一下很快,不也影响体验?
解决方案:
1.X版本只能自己另外创建个线程调用get方法以触发property的access,进而触发configurationChanged。
2.X版本新增了一个PeriodicReloadingTrigger来解决此问题,它会起一个ScheduledExecutorService,通过线程方式来处理
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统