做项目时,每次改一个配置文件,都需要重启,还挺烦的,正好测试部也提出来希望能够配置文件热更新,在网上也看了下设计方案。感觉都是依靠轮询。
下面就来说说整理的几种方案:
方案一: lastModified() 方法
通过轮询的方式,获取文件的最后修改时间,然后对比上一次的修改时间,判断文件是否已变更。
轮询的实现就不说了,七个定时器啥的,上一下判断变更的方式
/**
* @author <a href="mailto:Tastill">Tastill</a>
* @version 2019/1/24 13:54
* @description Test
*/
public class Test {
//上次更新时间 默认0
private static long modifiedTime = 0L;
public static void main(String[] args){
File file = new File("D:\\Test\\egov.properties");
long lastTime = file.lastModified();
if (lastTime > modifiedTime){//表示文件以变更
//处理逻辑
}
//处理完成后,变更文件更新时间
modifiedTime = lastTime;
}
}
方案二:通过appache提供的commons-io架包里FileAlterationListenerAdaptor类
1、maven添加commons-io依赖
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
2、继承FileAlterationListenerAdaptor类,重写里面的方法
package cn.*.file;
import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
import org.apache.commons.io.monitor.FileAlterationObserver;
import org.springframework.beans.factory.annotation.Autowired;
import java.io.File;
import java.util.Properties;
/**
* @author <a href="mailto:Tastill">Tastill</a>
* @version 2019/1/24 14:55
* @description FileListener
*/
public class FileListener extends FileAlterationListenerAdaptor {
/**
* @description 启动监听
* @param
* @return
* @version 2.0, 2019/1/24 15:08
* @author <a href="mailto:Tastill">Tastill</a>
*/
@Override
public void onStart(FileAlterationObserver observer) {
// System.out.println("启动监听器:");
}
@Override
public void onDirectoryCreate(File directory) {
System.out.println("有新文件夹生成:"+directory.getName());
}
@Override
public void onDirectoryChange(File directory) {
System.out.println("有文件夹发生变化:"+directory.getName());
}
@Override
public void onDirectoryDelete(File directory) {
System.out.println("有文件夹被删除:"+directory.getName());
}
/**
* @description 文件创建
* @param
* @return
* @version 2.0, 2019/1/24 14:59
* @author <a href="mailto:Tastill">Tastill</a>
*/
@Override
public void onFileCreate(File file){
System.out.println("有新文件生成:"+file.getName());
}
/**
* @description 文件内容发生变化
* @param
* @return
* @version 2.0, 2019/1/24 15:05
* @author <a href="mailto:Tastill">Tastill</a>
*/
@Override
public void onFileChange(File file){
System.out.println("有文件被修改:"+file.getName());
}
/**
* @description 文件被删除
* @param
* @return
* @version 2.0, 2019/1/24 16:13
* @author <a href="mailto:Tastill">Tastill</a>
*/
@Override
public void onFileDelete(File file){
System.out.println("有文件被删除:"+file.getName());
}
/**
* @description 监听停止
* @param
* @return
* @version 2.0, 2019/1/24 15:07
* @author <a href="mailto:Tastill">Tastill</a>
*/
@Override
public void onStop(FileAlterationObserver observer){
// System.out.println("监听停止");
}
}
大家可以再重写的方法里面添加具体实现
3、开启监听
package cn.gtmap.estateplat.olcommon.plugs.file;
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.monitor.FileAlterationMonitor;
import org.apache.commons.io.monitor.FileAlterationObserver;
import java.util.concurrent.TimeUnit;
/**
* @author <a href="mailto:Tastill">Tastill</a>
* @version 2019/1/24 15:00
* @description FileMonitorTest
*/
public class FileMonitor {
public static void main(String[] args) throws Exception{
// 监控目录
String rootDir = "D:\\Test";
// 轮询间隔 5 秒
long interval = TimeUnit.SECONDS.toMillis(5);
// 创建一个文件观察器用于处理文件的格式
FileAlterationObserver _observer = new FileAlterationObserver(
rootDir,
FileFilterUtils.and(
FileFilterUtils.fileFileFilter(),
FileFilterUtils.suffixFileFilter(".txt")), //过滤文件格式
null);
FileAlterationObserver observer = new FileAlterationObserver(rootDir);
observer.addListener(new FileListener()); //设置文件变化监听器
//创建文件变化监听器
FileAlterationMonitor monitor = new FileAlterationMonitor(interval, observer);
// 开始监控
monitor.start();
}
}
现在就可以实现对某文件夹内情况进行监听啦!
扫描二维码关注公众号,回复:
9882569 查看本文章
我觉得第二种比较省心,而且也很简单,不妨可以使用第二种!