Asakusa FrameworkのOperator 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を用意しておく。