--------------------------------------------------------------------------------------------------------------------------------------
需求:当采用配置与代码分离时,如果只是修改配置文件(比如properties文件), 无需重启服务器
方案:采用commons-configuration-1.10.jar的org.apache.commons.configuration.reloading.FileChangedReloadingStrategy
来实现动态加载配置文件的问题
测试:step1: 启动main方法
step2: 修改当前类的class文件所在的目录下的reloadstrategy-test.properties文件里面的属性user.loginName
的值并保存文件,可以看到输出已更新为最新的值
---------------------------------------------------------------------------------------------------------------------------------------
示例代码采用Maven依赖:
<!-- https://mvnrepository.com/artifact/commons-configuration/commons-configuration -->
<dependency>
<groupId>commons-configuration</groupId>
<artifactId>commons-configuration</artifactId>
<version>1.10</version>
</dependency>
代码:
package cn.raysun.demo.shiro.other;
import java.io.File;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.commons.configuration.reloading.FileChangedReloadingStrategy;
/**
* {@code FileChangedReloadingStrategy}的测试类
* @author ray.sun
*
*/
public class FileChangedReloadingStrategyTest {
//加载文件的频率
private static final long RELOAD_PERIOD = 10L;
private static PropertiesConfiguration config;
public static void main(String[] args) {
//获得当前类运行的classpath路径
String currentClassPath = ClassLoader.getSystemResource("").getPath();
initialize(currentClassPath + "reloadstrategy-test.properties");
while(true){
try {
System.out.println("user=" + config.getString("user.loginName"));
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//初始化配置文件和文件加载策略
private static void initialize(String filePath){
try {
FileChangedReloadingStrategy fileChangedReloadingStrategy = new FileChangedReloadingStrategy();
//设置扫描文件的最小时间间隔
fileChangedReloadingStrategy.setRefreshDelay(RELOAD_PERIOD);
//设置加载策略
config = new PropertiesConfiguration(new File(filePath));
config.setReloadingStrategy(fileChangedReloadingStrategy);
} catch (ConfigurationException e) {
e.printStackTrace();
}
}
}