`
aa860326
  • 浏览: 96410 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

web应用生产环境properties文件自动更新

    博客分类:
  • J2EE
 
阅读更多

在我们的生产系统上,如果我们修改了properties中的一个配置项,如果想要这个配置生效,最简单的办法就是把这个应用重启。但是现实却不允许我们这样做。以下简单实现了一些代码,可以在修改配置项之后,做到自动加载这个配置的值。以下提供简单的思路和代码:

package com.busi.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.Set;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.ConcurrentHashMap;

import org.apache.log4j.Logger;


public class PropertyUtil {
	
	private static final Logger LOG = Logger.getLogger(PropertyUtil.class);
	private static final String PROPERTIES_SUFFIX = ".properties";
	private static List<String> register = Collections.synchronizedList(new ArrayList<String>());
	private static Map<String, String> keyValues = new ConcurrentHashMap<>();
	private static Timer timer = new Timer(PropertyUtil.class.getName());
	private static final long DELAY_TIME = 5000; // 延迟加载时间(单位:ms)
	
	
	private static String getClassPath(){
		return PropertyUtil.class.getResource("/").getPath();
	}
	
	
	private static String getFileAboslutePath(String filename){
		StringBuffer buffer = new StringBuffer();
		buffer.append(getClassPath());
		buffer.append(filename);
		buffer.append(PROPERTIES_SUFFIX);
		return buffer.toString();
	}
	
	
	public static void register(String... filenames){
		for (String filename : filenames){
			if (!register.contains(filename)){
				register.add(filename);
				final TimerTask task = new PropertiesTask(filename);
				timer.schedule(task, 0, DELAY_TIME);
			}
		}
	}
	
	private static void loadProperties(String filename){
		InputStream is = null;
		try {
			String fileAbsolutePath = getFileAboslutePath(filename);
			is = new FileInputStream(fileAbsolutePath);
			Properties properties = new Properties();
			properties.load(is);
			is.close();
			if (!properties.isEmpty()){
				Set<Entry<Object, Object>> set = properties.entrySet();
				Iterator<Map.Entry<Object, Object>> it = set.iterator();
				String key = null;
				String value = null;
				while(it.hasNext()){
					Entry<Object, Object> entry = it.next();
					key = String.valueOf(entry.getKey());
					value = String.valueOf(entry.getValue());
					keyValues.put(key, value);
				}
				LOG.debug("#loadProperties() Properties文件内容:"+keyValues);
			}
			
		} catch (Exception e){
			LOG.error("#loadProperties() Properties文件加载异常", e);
		}
	}
	
	public static String getStrValue(String key, String defaultValue){
		String value = keyValues.get(key);
		return (null == value)?defaultValue:value.trim();
	}
	
	public static Integer getIntValue(String key, Integer defaultValue){
		String value = keyValues.get(key);
		return (null == value)?defaultValue:Integer.valueOf(value.trim());
	}
	
	static class PropertiesTask extends TimerTask{
		
		private String filename;
		private long lastModified;
		
		public PropertiesTask(String filename){
			super();
			this.filename = filename;
			this.lastModified = 0l;
		}
		
		public void run() {
			try {
				File file = new File(getFileAboslutePath(filename));
				if (!file.exists()){
					LOG.info(filename+"文件不存在!");
				}
				long newLastModified = file.lastModified();
				if (newLastModified > lastModified){
					LOG.info("Properties文件["+filename+"]有变动,重新加载!");
					lastModified = newLastModified;
					loadProperties(filename);
				}
			} catch (Exception e){
				LOG.error("#run() Properties文件处理异常", e);
			}
		}
	}
	
	public static void main(String[] args) throws Exception{
		PropertyUtil.register("system", "test");
		Thread.sleep(200l);
		System.out.println(PropertyUtil.getStrValue("platform.name", "service"));
	}
}



 上诉代码还有一些不足的地方,欢迎拍砖。

 --------------------------------------------------分割线--------------------------------------------------------

IT行业我认为是个高危的行业,“996”模式在互联网公司很常见,每每出现过劳死几乎是这个行当。因此我们应该具备一定风险意识,给自己投资一定的风险保证金:https://ssl.700du.cn/shopping/18611517897。给自己和家人一个保障。

分享到:
评论

相关推荐

    IDEA WEB项目启动不加载application.properties配置文件.docx

    application.properties配置文件是一个properties文件,用于存储项目的配置信息,例如数据库连接信息、服务器配置信息等。这个文件通常位于项目的src/main/resources目录下。 在IDEA WEB项目中,application....

    c#操作properties,读写配置文件

    ### C#操作Properties,读写配置文件 在C#编程中,经常需要处理应用程序的配置信息,例如数据库连接字符串、用户界面的语言设置等。这些配置信息通常存储在配置文件中,便于程序运行时动态加载和修改。C#提供了一种...

    Struts 2 properties文件详解

    ### Struts 2 properties文件详解 #### 概述 `struts.properties` 文件是Struts 2框架中的核心配置文件之一,它包含了Struts 2框架运行时所需的一系列配置属性。这些属性决定了Struts 2的行为特征以及与其他组件如...

    eclipse的properties文件插件

    Eclipse是一款广泛使用的Java集成开发环境(IDE),而MyEclipse是其商业版本,提供了更多的功能,包括对Web、移动和企业级应用的支持。在处理国际化(i18n)项目时,`properties`文件是必不可少的,它们用于存储应用...

    项目配置文件( spring-mvc.xml spring-mybatis.xml web.xml log4j.properties)

    这里提到的四个关键配置文件——`spring-mvc.xml`、`spring-mybatis.xml`、`web.xml`以及`log4j.properties`,对于一个基于Java的Web应用来说至关重要,特别是使用Spring MVC和MyBatis框架的时候。接下来,我们将...

    Java读取Properties文件的六种方法

    ### Java读取Properties文件的六种方法 在Java开发中,`Properties` 文件常用于存储配置信息,如数据库连接字符串、应用配置等。正确且高效地读取这些配置文件对于程序运行至关重要。本文将详细介绍六种不同的方法...

    Java读取Properties文件的六种方法.txt

    ### Java读取Properties文件的六种方法 在Java开发中,`Properties`类是一个非常实用且常见的工具类,主要用于管理程序中的配置信息。通常情况下,这些配置信息会被存储在一个`.properties`文件中,并通过`...

    java类文件通过$获取properties文件的属性值

    ### Java 类文件通过 $ 获取 properties 文件的属性值 在Java开发中,经常需要读取配置文件中的信息,例如数据库连接信息、系统环境变量等。这些配置通常存储在`.properties`文件中,便于维护和管理。本文将详细...

    解决Struts中ApplicationResources.properties文件不支持中文问题

    Struts 框架中,ApplicationResources.properties 文件是用于存储应用程序的资源文件,如按钮文字、菜单项、提示信息等。然而,默认情况下,这些资源文件不支持中文,导致中文字符显示乱码或无法正常显示。解决这个...

    java web开发中获取tomcat上properties文件内容的方法

    本文讲述了在Tomcat服务器环境下,如何通过Java代码来读取部署在服务器上的Web应用中的properties文件。首先,通过获取Tomcat工作目录,然后根据项目的结构构造出properties文件的绝对路径。接着,利用`java.util....

    jquery.i18n.properties-min-1.0.9.js文件下载

    总结来说,jQuery i18n Properties Minified 1.0.9.js是一款强大且实用的前端国际化工具,它简化了多语言网站的开发流程,提高了用户体验,是现代Web应用中不可或缺的一部分。对于那些致力于打造全球化网站的开发者...

    web应用数据库密码加密

    在现代Web应用开发中,数据安全是至关重要的一个环节,特别是在涉及到用户信息或者敏感数据时。SpringBoot和Spring框架在Java领域广泛应用于构建Web应用程序,它们提供了强大的功能和灵活性。然而,直接在配置文件...

    struts2的struts.properties配置文件详解

    Struts2是一个基于MVC模式的Web应用程序框架,它提供了一个名为Struts.properties的配置文件,该文件用于配置Struts2的各种参数和设置。下面将对Struts.properties配置文件中的重要参数进行详细解释。 1. struts....

    myeclipse properties插件

    7. **多语言支持**:对于国际化应用,插件支持创建和管理不同语言版本的.properties文件,方便实现应用的本地化。 8. **预览功能**:在编辑过程中,可以预览.properties文件中的键值对在实际应用中的效果。 9. **...

    一个没有安装IIS环境运行 Asp.Net web应用程序的例子

    标题所提及的“一个没有安装IIS环境运行 Asp.Net web应用程序的例子”,实际上是在指如何在没有安装IIS的情况下启动和运行一个Asp.Net Web应用程序。这可以通过使用内置的ASP.NET开发服务器(也称为 Cassini 服务器...

    myeclipse插件——properties编辑器

    在深入探讨“myeclipse插件——properties编辑器”这一主题前,我们首先需要了解几个关键概念:MyEclipse、properties文件以及插件在开发环境中的作用。 ### MyEclipse MyEclipse是一款功能强大的集成开发环境...

    jquery.i18n.properties在asp.net里的应用

    **jQuery.i18n.properties 在 ASP.NET 中的应用详解** 在多语言网站开发中,提供不同地区的用户以他们本地语言查看内容是一项重要的需求。jQuery.i18n.properties 是一个用于 jQuery 的插件,它使得在 JavaScript ...

Global site tag (gtag.js) - Google Analytics