JavaでAPサーバを再起動せずにpropertiesファイルを動的に読み込む方法
APサーバを再起動せずにpropertiesファイルを動的に読み込む方法があります。
最近知ったのですが、Java1.6よりResourceBundleに以下APIが追加されていました。
リソースバンドルのキャッシュ時間を設定することができるようになりました。と言う事はキャッシュしなければpropertiesファイルなどを動的に読み込むことが可能です。
static ResourceBundle getBundle(String baseName, Locale targetLocale, ResourceBundle.Control control)
static ResourceBundle getBundle(String baseName, ResourceBundle.Control control)
具体的な使用方法としてはシングルトンの設計でpropertiesファイルを読み込むようにしてあげればよいと思います。
private final ResourceBundle getResource() {
// ファイル名のベース名
final String BASENAME = "conf/Application";
ResourceBundle resource = ResourceBundle.getBundle(BASENAME,
new ResourceBundle.Control() {
@Override
public long getTimeToLive(String aBaseName, Locale aLocale) {
// キャッシュしない
return TTL_DONT_CACHE;
}
});
return resource;
}
もっと詳細に記述すると以下のようなコーディングが良いかと思います。
package com.confrage;
public class Test {
/** グローバル変数 */
private static Test instance;
/** プロパティズファイル */
private static final String BASE_NAME = "conf/Application";
/**
* プライベートコンストラクタ
*/
private Test() {
// インスタンス不可
}
/**
* Testインスタンスを同期をとって返す
* @return instance Testインスタンス
*/
public static synchronized Test getInstance() {
if (instance == null) {
instance = new Test();
}
return instance;
}
/**
* プロパティズファイルの設定値を返す
* @param key キー値
* @return 設定値
*/
public String getString(String key) {
return getResource().getString(key);// ここがミソ
}
/**
* キャッシュせずにリソースバンドルを取得する
* @return resource リソースバンドル
*/
private final ResourceBundle getResource() {
ResourceBundle resource = ResourceBundle.getBundle(BASE_NAME,
new ResourceBundle.Control() {
@Override
public long getTimeToLive(String aBaseName, Locale aLocale) {
// キャッシュしない
return TTL_DONT_CACHE;
}
});
return resource;
}
}
そもそもなんですが、Constant.javaみたいな定数クラスとpropertiesファイルに分けても結局APサーバ再起動しないといけないのなら、あんまり切り分ける意味もメリットもわかりません。
※ご指摘頂いたので取り消しております
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント
定数クラス・・・全環境で同じ値
properties ・・・buildに依存して動的に変更
では?
ご教示頂きありがとうございます!
確かにその通りですね、その当時は環境が一つでしたので気づかなかったのかもしれません。
そして返信遅くなり申し訳ございません。–;
また色々読んでいただけると幸いです。