S-JIS[2017-06-04] 変更履歴

Asakusa Framework プロパティーファイル

Asakusa FrameworkOperator DSLでプロパティーファイルを読み込む方法。


概要

AsakusaFWでプロパティーファイルを読み込む方法を考えてみる。

プロパティーファイルはJavaのPropertiesクラスで扱うが、AsakusaFWは分散環境を相手にしているので、プロパティーファイルをどこに置くかが問題になる。
好きな場所に置いておいてパスを指定する、というわけにはいかない。
Asakusaアプリケーションから読み込むので、(AsakusaFWの他の設定ファイルと同様に)ASAKUSA_HOMEの下から読み込むのが良さそう。


プロパティーファイルの置き場所

Asakusa on M3BPの場合、ASAKUSA_HOME/m3bp/conf/の下にプロパティーファイルを置いておけば、AsakusaアプリからはClassLoader経由でそのファイルを読み込むことが出来る。
しかしAsakusa on Sparkの場合、同様にASAKUSA_HOME/spark/conf/の下に置いても読み込めない。

ASAKUSA_HOME/ext/lib/の下にjarファイル化して置いておけば、どの実行環境でも読み込める。
しかしプロパティーファイルをjarファイル化するのが面倒。

Asakusaアプリのソースの一部であるsrc/main/resources/の下にプロパティーファイルを置いておけば、バッチのコンパイル時にclassファイルと一緒に (各ジョブフローの)jarファイルに取り込まれる。
ただし、本番環境とテスト環境で異なるプロパティーファイルにしたい場合はどうすればいいだろう??

また、素のプロパティーファイルのまま実行環境に置ければ、実行環境上で直接プロパティーファイルを修正するといったことが出来るが、
jarファイル内に置かれていると、そういうことは出来ない。


プロパティーファイルを読み込む例

package com.example.operator;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.nio.charset.StandardCharsets;
import java.util.Properties;

import com.asakusafw.runtime.core.util.Shared;
public class PropertyUtil {
	private static final Shared<Properties> PROPERTIES = new Shared<Properties>() {
		@Override
		protected Properties initialValue() throws IOException {
			try (InputStream is = getClass().getClassLoader().getResourceAsStream("example.properties");
			     Reader r = new InputStreamReader(is, StandardCharsets.UTF_8)) {
				Properties p = new Properties();
				p.load(r);
				return p;
			}
		}
	};
	public static Properties getProperties() {
		return PROPERTIES.get();
	}
}

この例ではプロパティーを読み込むUtilクラスにしてみた。
これを呼び出すOperator/FlowPart(JobFlow)のテストを行う場合は、このクラスをSharedObjectCleanerに指定する。

テストの際には、src/test/resources/example.propertiesを用意しておく。


Operator DSLへ戻る / AsakusaFW目次へ戻る / 技術メモへ戻る
メールの送信先:ひしだま