修改配置文件不用重启tomcat

10 篇文章 0 订阅

项目需要频繁更新配置文件,每次改完需要先停tomcat,在重启很麻烦~~~

今天抽个空研究了一下,发现很多人都遇到类似的问题,然后综合了下各个网站的解决办法,我整了一个demo出来了,废话不多说先上图:


说明:配置文件第一次只有一个属性,test;待执行完后又添加一个新属性appId;


源代码如下:

package conf;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.ConcurrentHashMap;

import org.apache.log4j.Logger;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.support.PropertiesLoaderUtils;

/**
 * 动态加载配置文件
 * @author iYjrg_xiebin
 * @date 2016年8月9日下午3:55:09
 */
public class SysProperties implements Runnable{

	private static Logger log = Logger.getLogger(SysProperties.class);  

	private Map<String,Long> configFileModifyDate = new HashMap<String, Long>();
	/**
	 * 系统配置文件,包含系统classpath目录下config*.properties中的内容,5秒钟检查一次,如果有变化自动重新加载。
	 */
	public static Map<String,String> SYSTEM_CONFIG = new ConcurrentHashMap<String,String>();

	//配置文件路径  
	private static String defaultPropFileName = "/resources";  


	/**
	 * 系统配置文件监测,每5秒检测一次,如果配置文件有变化,则重新加载。
	 */
	@Override
	public void run() {
		int checkDely= 5*1000 ;		// 配置文件自动检查间隔;
		int beginDely = 60*1000;	// 1分钟后运行配置文件自动检查功能。
		try {
			Thread.sleep(beginDely);		
			log.info("启动 配置文件检查 线程,当前检测频率:"+checkDely);
		} catch (InterruptedException e1) {
			e1.printStackTrace();
		}
		while(true){
			try {
				this.loadAllConfigFiles();
			} catch (Exception e) {
				e.printStackTrace();
			}

			try {
				Thread.currentThread();
				Thread.sleep(checkDely);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

	}
	
	/**
	 * 检查系统配置文件,并更新全局变量 。
	 * @throws Exception 
	 * @date 2012-8-31
	 */
	private void loadAllConfigFiles(){
		String tempPath = this.getClass().getResource(defaultPropFileName).getFile();  
		File fileDir = new File(tempPath);  

		fileDir.listFiles(new FileFilter() {
			@Override
			public boolean accept(File file) {
				try {
					String name = file.getName();
					String fullPath = file.getAbsolutePath();

					if(name.matches("^sys.*\\.properties$")){//properties
						Long value = configFileModifyDate.get(fullPath);
						if(value==null || value.longValue()!=file.lastModified()){
							log.info("加载配置文件:"+file);
							loadPropertieFile(file);
							configFileModifyDate.put(fullPath,file.lastModified());
						}
					}
				} catch (Exception e) {
					e.printStackTrace();
				}

				return false;
			}
		});

	}

	/**
	 * 加载配置文件到SYSTEM_CONFIG
	 * @date 2012-8-31
	 * @param configFile 系统配置文件以 sys*.properties命名。
	 */
	private void loadPropertieFile(File configFile) {
		try {
			Properties properties = PropertiesLoaderUtils.loadProperties(new FileSystemResource(configFile));
			for(String key:properties.stringPropertyNames()){
				String value=properties.getProperty(key);

				log.info("load property:"+ key+"->"+value);
				SYSTEM_CONFIG.put(key,value);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		SysProperties sys = new SysProperties();
		sys.run();
	}

}

问题的核心在于:file.lastModified,如果当前map中存储的时间戳跟本次加载的不一致,就重新load一把;

然后哦哦~

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值