java实现web项目配置文件(properties、xml)热更新

做项目时,每次改一个配置文件,都需要重启,还挺烦的,正好测试部也提出来希望能够配置文件热更新,在网上也看了下设计方案。感觉都是依靠轮询。

下面就来说说整理的几种方案:

方案一: 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 查看本文章

我觉得第二种比较省心,而且也很简单,不妨可以使用第二种!

发布了57 篇原创文章 · 获赞 44 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/Tastill/article/details/86630160