在一些项目可能可能会使用一些配置文件,配置文件的类型可能为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);
}
}
}
他一开始就记录文件最后更新的时间,在读取属性是会判断文件是更新时间是否已经大于内存中保存的时间,如果大于将会重新加载配置
分享到:
相关推荐
在"Apache的Commons-configuration自动加载特性"中,我们将探讨这个库如何简化配置文件的读取和管理,并特别关注其自动加载功能。 自动加载特性是Apache Commons Configuration的一个强大功能,它允许程序在运行时...
Maven坐标:org.apache.commons:commons-configuration2:2.1.1; 标签:apache、commons、configuration2、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档...
赠送jar包:commons-configuration-1.10.jar 赠送原API文档:commons-configuration-1.10-javadoc.jar 赠送源代码:commons-configuration-1.10-sources.jar 包含翻译后的API文档:commons-configuration-1.10-...
commons-configuration2-2.0.jar Apache commons-configuration 读取配置文件
Apache Commons Configuration 是一个Java库,专门用于处理配置文件和提供灵活的访问机制。...在"commons-configuration-1.10"版本中,这些特性都得到了良好的支持和优化,为Java开发者提供了一个强大的配置管理工具。
Maven坐标:org.apache.commons:commons-configuration2:2.1.1; 标签:apache、commons、configuration2、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览...
赠送jar包:commons-configuration-1.10.jar; 赠送原API文档:commons-configuration-1.10-javadoc.jar; 赠送源代码:commons-configuration-1.10-sources.jar; 赠送Maven依赖信息文件:commons-configuration-...
`commons-configuration-1.10.jar`是Apache Commons Configuration库的一个稳定版本,发布于2013年,它为开发者提供了丰富的API来处理配置文件。此版本包含了对多种配置源的支持,包括传统的Java属性文件、XML文件...
commons-configuration-1.2.jar commons-configuration-1.2.jar
Apache Commons ID 和 Commons Discovery 是两个在Java开发中广泛使用的开源库,它们是Apache软件基金会的项目,为开发者提供了丰富的工具和功能。 Apache Commons ID 主要关注于生成唯一标识(ID)的功能,它提供...
apache-sanselan-incubating-0.97-bin bcel-5.2 commons-beanutils-1.9.2-bin commons-chain-1.2-bin commons-cli-1.3.1-bin commons-codec-1.10-bin commons-collections4-4.0-bin commons-configuration-1.10-bin...
commons-configuration-1.8.jar
赠送jar包:commons-configuration-1.7.jar; 赠送原API文档:commons-configuration-1.7-javadoc.jar; 赠送源代码:commons-configuration-1.7-sources.jar; 赠送Maven依赖信息文件:commons-configuration-1.7....
"commons-io-2.5.jar"是Apache Commons IO库的一个版本,针对JDK 1.6及更高版本设计。在这个版本中,用户可以找到许多优化和增强的功能。 1. **IOUtils**: IOUtils是Apache Commons IO中的核心类之一,它提供了大量...
赠送jar包:commons-configuration-1.7.jar; 赠送原API文档:commons-configuration-1.7-javadoc.jar; 赠送源代码:commons-configuration-1.7-sources.jar; 赠送Maven依赖信息文件:commons-configuration-1.7....
jar包大小:135KB commons-validator-1.3.1.jar jar包大小:93KB commons-transaction-1.2.jar jar包大小:141KB commons-scxml-0.6.jar jar包大小:254KB commons-primitives-1.0.jar jar包大小:60KB commons-pool-1.3....
Apache commons-csv-1.6 jar包,java7,针对csv的各种操作,需要的下载
commons-configuration-1.6
commons-configuration-1.10