设为首页 收藏本站
查看: 1649|回复: 0

[经验分享] Apache的Commons-configuration自动加载(刷新)特性

[复制链接]

尚未签到

发表于 2017-1-10 09:31:24 | 显示全部楼层 |阅读模式
  
在一些项目可能可能会使用一些配置文件,配置文件的类型可能为xml,或者properties文件等,
可以采用Apache
的commons-confiugrations实现相关的功能。
http://blog.csdn.net/buyaore_wo/article/details/6203022

  
如果这些配置文件要经常变化,
我们系统会自动检测到配置文件的变化,自动更新到内存等中,可能这样做:

  


PropertiesConfiguration config = new PropertiesConfiguration("config.properties");
config.setReloadingStrategy(new FileChangedReloadingStrategy());



那么它是怎么做到的自动重载呢:看下源码:  
org.apache.commons.configuration.AbstractFileConfiguration中的部分方法

  


    public void reload()
{
synchronized (reloadLock)
{
if (noReload == 0)
{
try
{
enterNoReload(); // avoid reentrant calls
       if (strategy.reloadingRequired())
{
if (getLogger().isInfoEnabled())
{
getLogger().info("Reloading configuration. URL is " + getURL());
}
fireEvent(EVENT_RELOAD, null, getURL(), true);
setDetailEvents(false);
boolean autoSaveBak = this.isAutoSave(); // save the current state
this.setAutoSave(false); // deactivate autoSave to prevent information loss
try
{
clear();
load();
}
finally
{
this.setAutoSave(autoSaveBak); // set autoSave to previous value
setDetailEvents(true);
}
fireEvent(EVENT_RELOAD, null, getURL(), false);
// notify the strategy
strategy.reloadingPerformed();
}
}
catch (Exception e)
{
fireError(EVENT_RELOAD, null, null, e);
// todo rollback the changes if the file can't be reloaded
}
finally
{
exitNoReload();
}
}
}
}
//............
public Object getProperty(String key)
{
synchronized (reloadLock)
{
reload();
return super.getProperty(key);
}
}
public boolean isEmpty()
{
reload();
return super.isEmpty();
}
public boolean containsKey(String key)
{
reload();
return super.containsKey(key);
}



看到在取数据之前它都有一相reload,看到这里 我们明白他不是主被的定期地去重新加载文件,而是在使用是被动的去重新加载的,
而判断是否要重新加载的重点是红色部分: 我们再看FileChangedReloadingStrategy中方法:



/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements.  See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License.  You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.commons.configuration.reloading;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import org.apache.commons.configuration.ConfigurationUtils;
import org.apache.commons.configuration.FileConfiguration;
/**
* <p>A reloading strategy that will reload the configuration every time its
* underlying file is changed.</p>
* <p>This reloading strategy does not actively monitor a configuration file,
* but is triggered by its associated configuration whenever properties are
* accessed. It then checks the configuration file's last modification date
* and causes a reload if this has changed.</p>
* <p>To avoid permanent disc access on successive property lookups a refresh
* delay can be specified. This has the effect that the configuration file's
* last modification date is only checked once in this delay period. The default
* value for this refresh delay is 5 seconds.</p>
* <p>This strategy only works with FileConfiguration instances.</p>
*
* @author Emmanuel Bourg
* @version $Revision: 606798 $, $Date: 2007-12-25 20:05:58 +0100 (Di, 25 Dez 2007) $
* @since 1.1
*/
public class FileChangedReloadingStrategy implements ReloadingStrategy
{
/** Constant for the jar URL protocol.*/
private static final String JAR_PROTOCOL = "jar";
/** Constant for the default refresh delay.*/
private static final int DEFAULT_REFRESH_DELAY = 5000;
/** Stores a reference to the configuration to be monitored.*/
protected FileConfiguration configuration;
/** The last time the configuration file was modified. */
protected long lastModified;
/** The last time the file was checked for changes. */
protected long lastChecked;
/** The minimum delay in milliseconds between checks. */
protected long refreshDelay = DEFAULT_REFRESH_DELAY;
/** A flag whether a reload is required.*/
private boolean reloading;
public void setConfiguration(FileConfiguration configuration)
{
this.configuration = configuration;
}
public void init()
{
updateLastModified();
}
public boolean reloadingRequired()
{
if (!reloading)
{
long now = System.currentTimeMillis();
if (now > lastChecked + refreshDelay)
{
lastChecked = now;
if (hasChanged())
{
reloading = true;
}
}
}
return reloading;
}
public void reloadingPerformed()
{
updateLastModified();
}
/**
* Return the minimal time in milliseconds between two reloadings.
*
* @return the refresh delay (in milliseconds)
*/
public long getRefreshDelay()
{
return refreshDelay;
}
/**
* Set the minimal time between two reloadings.
*
* @param refreshDelay refresh delay in milliseconds
*/
public void setRefreshDelay(long refreshDelay)
{
this.refreshDelay = refreshDelay;
}
/**
* Update the last modified time.
*/
protected void updateLastModified()
{
File file = getFile();
if (file != null)
{
lastModified = file.lastModified();
}
reloading = false;
}
/**
* Check if the configuration has changed since the last time it was loaded.
*
* @return a flag whether the configuration has changed
*/
protected boolean hasChanged()
{
File file = getFile();
if (file == null || !file.exists())
{
return false;
}
return file.lastModified() > lastModified;
}
/**
* Returns the file that is monitored by this strategy. Note that the return
* value can be <b>null </b> under some circumstances.
*
* @return the monitored file
*/
protected File getFile()
{
return (configuration.getURL() != null) ? fileFromURL(configuration
.getURL()) : configuration.getFile();
}
/**
* Helper method for transforming a URL into a file object. This method
* handles file: and jar: URLs.
*
* @param url the URL to be converted
* @return the resulting file or <b>null </b>
*/
private File fileFromURL(URL url)
{
if (JAR_PROTOCOL.equals(url.getProtocol()))
{
String path = url.getPath();
try
{
return ConfigurationUtils.fileFromURL(new URL(path.substring(0,
path.indexOf('!'))));
}
catch (MalformedURLException mex)
{
return null;
}
}
else
{
return ConfigurationUtils.fileFromURL(url);
}
}
}



他一开始就记录文件最后更新的时间,在读取属性是会判断文件是更新时间是否已经大于内存中保存的时间,如果大于将会重新加载配置  


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-326368-1-1.html 上篇帖子: 本地机apache配置基于域名的虚拟主机 下篇帖子: Apache httpd 2.2 与 svn 1.6.17集成
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表