您的位置:首页 > 编程语言 > Java开发

Java自动重载Spring配置文件

2016-05-03 11:58 295 查看
系统中有些配置文件,修改后需要重启应用,这很让人苦恼,也很无奈,谁叫他只加载一次。

下面涉及动态加载配置文件。

需求如下:

“如果配置文件有改动,自动加载配置文件,重配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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: