一般系统都会有一个Property文件,比较头疼的是每次更改Property文件,都要重新启动服务,不然就读不进来。
怎样才能不启动服务就能读取最新的Property呢。
代码如下:
package sample.resource;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.Properties;
/**
* <p>Property FileをLoadし、ApplicationにProperty値を公開するためのclassです。
* 以下の点に注意して実装してください。</p>
* <ul>
* <li>Singleton Patternを適用する。</li>
* <li>JavaBeansとして使用する場合、Default Constructorをprotectedとする。(任意)</li>
* <li>propertyのkeyをprivateとし、その値に対するgetter methodのみを外部に公開する。</li>
* <li>instance参照の度に一定の時間間隔でproperty fileの更新日時をcheckし、
* fileが更新されていた場合はPropertyをreloadする。</li>
* </ul>
* <p>
* この例ではsample.propertiesを<classpath>/sample/resource/に配置してください。
* </p>
* @see {@link EnvironmentPropertiesWrapper}
*/
public class EnvironmentProperties {
/**
* 唯一のインスタンス
*/
private static EnvironmentProperties singleton = new EnvironmentProperties();
/**
* リソースファイル名
*/
private static final String RESOURCE_FILE = "sample.properties";
/**
*
*/
private Properties prop = new Properties();;
/**
* 最後にロードしたプロパティファイルの更新日時
*/
private long lastLoad = 0L;
/**
* 最後にファイル更新チェックを実行した日時
*/
private long lastCheck = 0L;
/**
* ファイル更新チェックを行う時間間隔(ミリ秒)
*/
private long loadSpan = 5000L;
/**
* プロパティのキー
*/
private static final String XXX_PATH = "xxx.path";
protected EnvironmentProperties() {
super();
}
/**
* インスタンスを取得します。
* このメソッドが使用される都度、init()メソッドが実行されます。
* @return
*/
public static synchronized EnvironmentProperties getInstance() {
if(singleton == null) {
singleton = new EnvironmentProperties();
}
singleton.init();
return singleton;
}
/**
* 単体テストのために、クラス単体でも起動できるようにしておくと便利です。
* @param args
*/
public static void main(String[] args) {
while (true) {
System.out.println(EnvironmentProperties.getInstance().getXXXPath());
try {
Thread.sleep(10000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/**
* プロパティファイルをロードする処理です。
*/
protected void init() {
// チェック間隔調整チェック
// 最後にファイル更新チェックが実行されてから一定時間以内であれば、何も処理せずにreturn
if(System.currentTimeMillis() - this.lastCheck < this.loadSpan) {
return ;
}
this.lastCheck = System.currentTimeMillis();
URL url = this.getClass().getResource(RESOURCE_FILE);
if(url == null) {
System.err.println(String.format("設定ファイル%1$sが見つかりません。", RESOURCE_FILE));
return;
}
File file = new File(url.getFile());
// ファイル更新チェック
// 最後にロードされてからファイルが更新されていなければ、何も処理せずにreturn
if(file.lastModified() <= this.lastLoad) {
return ;
}
try {
this.getProperties().load(url.openStream());
// Property Fileがreloadされたことを通知するLogを出力
System.out.println(this.getClass() + " load file:" + file);
this.lastLoad = file.lastModified();
// reloadされたProperty Fileの内容をLogに出力
System.out.println(this.getClass() + " load properties:" + this.getProperties());
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Property:XXXPathの値を取得します。
* @return
*/
public String getXXXPath() {
return this.getProperties().getProperty(XXX_PATH);
}
/**
*
* @return
*/
protected Properties getProperties() {
return this.prop;
}
}
分享到:
相关推荐
3. **配置文件加载库**:许多第三方库提供了配置文件的动态加载功能,例如Spring Framework的`ConfigurableEnvironment`和`PropertySource`,Apache Commons Configuration,以及Google的`Guice`等。这些库通常会...
这个扩展提供了本地静态服务器功能,并且集成了LiveReload,使得修改后的HTML、CSS或JavaScript文件能自动在浏览器中刷新。 2. **设置工作区配置**:在VS Code的工作区根目录下创建或编辑`.vscode/settings.json`...
修改 webpack 相关配置文件后,自动重启脚本命令,比如 dev-server,比较方便的是在调试 webpack 繁琐的配置时候,省去一遍遍地 Ctrl+c 和重复输入命令。 注意:只支持 webpack/webpack-dev-server 两个命令。 安装...
1. 启动LiveReload服务器:在Sublime Text 3中打开命令面板,输入“LiveReload: Start/Stop Server”启动或停止LiveReload服务。 2. 集成浏览器扩展:为了实现浏览器自动刷新,还需要在浏览器中安装相应的LiveReload...
谷歌浏览器的插件扩展通常以.crx为后缀,如文件"LiveReload2.1.0.0.crx",这是一个具体的LiveReload版本的安装包。安装.crx扩展通常需要通过谷歌浏览器的扩展管理界面进行,或者在离线状态下通过特定方法添加。 ...
gulp-webserver, 使用LiveReload运行本地web服务器的流媒体插件 web服务器 使用LiveReload运行本地web服务器的流媒体插件提示:这是对吞咽连接的重新编写。安装$ npm install --save-dev gulp-webserver用法gulp.src...
1. 配置:确保在项目的根目录下启动LiveReload服务器,并正确配置要监听的文件类型。 2. 扩展安装:在浏览器中安装并启用LiveReload插件,并连接到本地运行的LiveReload服务器。 3. 文件类型:并非所有类型的文件...
服务器负责监听文件系统中的变化,而浏览器扩展则负责接收服务器的通知并执行刷新操作。在设置好项目后,只需要启动LiveReload服务器,然后在浏览器中安装相应的扩展,两者之间就会建立连接。 对于HTML标签的理解,...
如果配置文件测试通过,就可以使用nginx -s reload命令来重新加载配置,这样不需要重启Nginx服务,就能让新的配置生效。如果要重启服务,可以使用nginx -s stop命令来停止服务,再用nginx命令来启动服务。
3. **无需重启**:对于使用Web服务器运行的应用,LiveReload可以避免在每次更改后重新启动服务器。 4. **多语言支持**:不仅限于HTML,还包括CSS、Sass、LESS、CoffeeScript等多种前端语言。 5. **扩展性**:通过...
首先,你需要在你的项目中安装Grunt和相应的Grunt插件,如`grunt-contrib-watch`用于监控文件变化,`grunt-livereload`用于启动LiveReload服务器。 安装过程包括以下几个步骤: 1. 确保已安装Node.js和npm(Node包...
2. **配置项目**: 在你的项目中,通常需要在HTML文件的头部添加一个特殊的`<script>`标签,指向LiveReload服务器的URL。这使得浏览器知道在哪里查找更新。 ```html <script>document.write('(location.host || '...
5. **监控与优化**:定期监控服务器性能,如果发现资源消耗过大,可以考虑调整`servlet-reload-check-secs`的值,或者在不影响开发流程的前提下,增加手动重启的频率。 总的来说,虽然WebLogic 8.1提供的这个特性...
当你在编辑器中保存文件时,LiveReload会监听到这个变化,然后立即向浏览器发送指令,使得浏览器自动刷新页面。这样,你就可以即时查看到代码更改后的效果,无论是调整字体大小、改变布局还是修复JavaScript错误,都...
在本文中,我们将深入探讨如何在CentOS 6.3操作系统上安装Nginx并用其搭建文件服务器。Nginx是一款高性能的Web服务器和反向代理服务器,因其高效的并发处理能力和稳定性而广受欢迎。首先,让我们从安装Nginx开始。 ...
而Hot Reload插件则改变了这一点,它允许开发者在游戏运行时即时修改C#脚本,修改后的代码会立即反映到游戏中,无需重启或重新部署。 Hot Reload 1.12.9版本是该插件的一个更新,可能包含了一些性能改进、bug修复...
默认情况下,LiveReload会自动检测本地开发服务器并开始监听文件变化。如果需要手动配置,可以在LiveReload的设置中添加自定义服务器地址。 对于团队开发环境,LiveReload还支持多个设备同步刷新。这意味着当一台...