主题:Java自动重载Spring配置文件

系统中有些配置文件,修改后需要重启应用,这很让人苦恼,也很无奈,谁叫他只加载一次。
下面涉及动态加载配置文件。
需求如下:
         “如果配置文件有改动,自动加载配置文件,重配Spring加载”
需要监控目录下的文件是否变更,可以设置监控间隔时间,比如我这配置发上去,1分钟后自动生效,具体的生效时间可自定义.
代码如下,借助commons-io.jar,毕竟重复造轮子不是我的最爱.
package com.ycl.filter.FileCleaner;

import org.apache.commons.io.monitor.FileAlterationMonitor;
import org.apache.commons.io.monitor.FileAlterationObserver;

/**
 * 监控类.
 * @author yangchunlong.tw
 *
 */
public class FileMonitor {

 FileAlterationMonitor monitor = null;

 /**
  * 默认10妙看一次
  * @param ob
  */
 public FileMonitor(FileAlterationObserver ob){
  this(10000,ob);
 }

 /**
  * 每隔多少时候看一次,观察者
  * @param fileName
  * @param ob
  */
 public FileMonitor(long interval,FileAlterationObserver ob){
  monitor = new FileAlterationMonitor(interval,new FileAlterationObserver[]{ob});
 }

 /**
  * 添加观察者
  * @param observer
  */
 public void addObserver(FileAlterationObserver observer){
  monitor.addObserver(observer);
 }

 /**
  * 移除观察者
  * @param observer
  */
 public void removeObserver(FileAlterationObserver observer){
  monitor.removeObserver(observer);
 }

 /**
  * 获取所有观察者
  * @return
  */
 public Iterable<FileAlterationObserver> getObservers() {
  return monitor.getObservers();
 }

 /**
  * 启动监控[observer.initialize()]
  */
 public void start(){
  try {
   monitor.start();
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 /**
  * 停止监控[observer.destroy()]
  */
 public void stop(){
  try {
   monitor.stop();
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }

 /**
  * [不做调用]
  * 具体的监控操作:
  *     observer.checkAndNotify()
  */
 private void run(){
  monitor.run();
 }


}

 

 

 

以上是文件监控类,其中涉及到观察者,观察者如下:

 

 

 

package com.ycl.filter.FileCleaner;

import java.io.File;
import java.io.FileFilter;

import org.apache.commons.io.IOCase;
import org.apache.commons.io.monitor.FileAlterationListener;
import org.apache.commons.io.monitor.FileAlterationObserver;

public class FileObserver extends FileAlterationObserver{

 private static final long serialVersionUID = 3637219592248717850L;

 /**
  * 设置观查的文件对象/路径对象
  * @param directory
  */
 public FileObserver(String directory) {
  this(new File(directory),(FileFilter)null);
 }

 /**
  * 设置观查的文件路径,带文件过滤器,比如所有xml文件.
  *     这里的IOCase是设置文件比较器(排序).[根据系统,可以不用理会]
  * @param directoryName
  * @param fileFilter
  */
 public FileObserver(File fileName, FileFilter fileFilter){
  super(fileName,fileFilter,(IOCase)null);
 }

 /**
  * 监控启动时初始化方法
  *   1. 刷新本文件对象
  *   2. 得到本文件列表
  *   3. 循环初始化File实体
  *   4. 设置本文件以及其下的上下级关系
  */
  public void initialize() throws Exception {
  super.initialize();
  }

  /**
   * 停止监控
   *  默认啥都没做
   */
  public void destroy() throws Exception {
   super.destroy();
  }


  /**
   * 监测文件有没有创建,修改,删除
   *        并触发相应监听
   *        如果文件名称比原先的大,那么创建一个实体,并调用onDirectoryCreate/onFileCreate
   *        如果文件名称比原先的小,那么删除一个实体,并调用onDirectoryDelete/onFileDelete
   *        如果文件名称和原告的一样,新的文件与原先的文件进行对比,如果文件属性有改变,并调用onDirectoryChange/onFileChange,循环调用自身,可能是文件夹
   *        如果名称长度排在之后,添加文件,并调用onDirectoryCreate/onFileCreate
   * 这样就注册了所有文件的监听器
   */
  public void checkAndNotify() {
   super.checkAndNotify();
  }

  /**
   * 添加监听器
   */
  public void addListener(final FileAlterationListener listener) {
   super.addListener(listener);
  }

  /**
   * 移除监听器
   */
  public void removeListener(final FileAlterationListener listener) {
   super.removeListener(listener);
  }


  /**
   * 获取观察者对象的所有监听器
   */
  public Iterable<FileAlterationListener> getListeners() {
   return super.getListeners();
  }

}

 

在观察者当中涉及到监听者,比如当文件变化了,有个监听者去执行相应的逻辑,比如重新加载Spring配置文件:

 

 

package com.ycl.filter.FileCleaner;

import java.io.File;

import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
import org.apache.commons.io.monitor.FileAlterationObserver;

public class FileListener extends FileAlterationListenerAdaptor{

 @Override
 public void onDirectoryChange(File directory) {
  System.out.println("文件目录变更了:"+directory.getAbsolutePath());
 }

 @Override
 public void onDirectoryCreate(File directory) {
  System.out.println("文件目录创建了:"+directory.getAbsolutePath());
 }

 @Override
 public void onDirectoryDelete(File directory) {
  System.out.println("文件目录删除了:"+directory.getAbsolutePath());
 }

 @Override
 public void onFileChange(File file) {
  System.out.println("文件变更了:"+file.getAbsolutePath());
 }

 @Override
 public void onFileCreate(File file) {
  System.out.println("文件创建了:"+file.getAbsolutePath());
 }

 @Override
 public void onFileDelete(File file) {
  System.out.println("文件删除了:"+file.getAbsolutePath());
 }

 @Override
 public void onStart(FileAlterationObserver observer) {
  System.out.println("开始监听:"+observer.getDirectory());
 }

 @Override
 public void onStop(FileAlterationObserver observer) {
  System.out.println("停止监听:"+observer.getDirectory());
 }

}

 

万事俱备了,以下是测试代码:

 

package com.ycl.filter.FileCleaner;

public class TestFileMonitor {

 public static void main(String args[]){
  FileObserver ob = new FileObserver("D://test");
  FileListener listener = new FileListener();
  ob.addListener(listener);
  FileMonitor monitor = new FileMonitor(ob);
  monitor.start();
 }
}

 

 

监听某个目录下的文件,如果不需要监听,可以调用stop()方法。比如我可以在配置里面设置这个参数来控制是否需要动态加载Spring配置文件.
测试结果如下:

 

...
文件目录创建了:D:/test/bbb
停止监听:D:/test
开始监听:D:/test
文件目录删除了:D:/test/bbb
文件目录创建了:D:/test/新建文件夹
停止监听:D:/test
开始监听:D:/test
文件目录创建了:D:/test/cccc
文件目录删除了:D:/test/新建文件夹
停止监听:D:/test
开始监听:D:/test
文件创建了:D:/test/cccc/新建 文本文档.txt
停止监听:D:/test
开始监听:D:/test
文件创建了:D:/test/cccc/abc.test
文件删除了:D:/test/cccc/新建 文本文档.txt
停止监听:D:/test
开始监听:D:/test
文件删除了:D:/test/cccc/abc.test
文件目录删除了:D:/test/cccc
停止监听:D:/test

 

可以返复操作此目录下的文件或者文件夹,这里都能监听到此目录下文件的变化.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值