|
|
WebOTX Manual V11.1 (第6版) 目次を表示 |
MicroProfile Config は Java のシステムプロパティ、環境変数、.properties ファイルに設定した値を集約して、アプリケーション上で取得するための API を提供します。 これにより、アプリケーションでは、どこで設定が行われているかを意識することなく、 同じ API により値を取得することができます。 もし、同じ設定名で複数個所に別の値が設定されていた場合、優先順位の高い値が取得されます。 この優先度については、「MicroProfile Config の優先度」 にて説明します。
以下にアプリケーションで API を使用して、値を取得する際のイメージ図を示します。
上記の例では、userId という設定名を MicroProfile Config API で提供している ConfigProvider の getValue により取得しています。
MicroProfile Config で使用できる API の詳細については、次節で例を挙げて説明します。
アプリケーションで設定値を取得するためには、ConfigProvider または
@Inject Config で注入する方法があります。
public class ConfigUsageSample {
public void useTheConfig() {
Config config = ConfigProvider.getConfig();
String serverUrl = config.getValue("acme.myprj.some.url", String.class);
callToServer(serverUrl);
}
}
@Inject
private Config config;
@Inject
@ConfigProperty(name="myprj.some.url")
private String someUrl;
@Inject
@ConfigProperty(name="myprj.some.port")
private Optional<Integer> somePort;
@Inject
@ConfigProperty(name="myprj.some.dynamic.timeout", defaultValue="100")
private javax.inject.Provider<Long> timeout;
@ConfigProperty で値を注入するとき、Converter にて指定した型に変換が行われます。
WebOTX V11 で使用できる Converter は MicroProfile Config 2.0 で定義されている以下です。
WebOTX V11 では、MicroProfile Config 2.0 で定義されている以下の設定値を取得することができます。
これらに同じプロパティ名が指定されていた場合は、優先度が高いものが使用されます。
この優先度は、MicroProfile Config 2.0 で以下のように定義されており、 WebOTX V11 での既定値です。
優先順位の設定は、WebOTX の以下で定義しています。
| dotted-name(CLINAME) | 説明 | 既定値 |
|---|---|---|
| server.microprofile.microprofile-config.sys-prop-ordinal | Java VM システムプロパティの優先度 | 400 |
| server.microprofile.microprofile-config.env-ordinal | 環境変数の優先度 | 300 |
| server.microprofile.microprofile-config.micro-prop-ordinal | microprofile-config.properties の優先度 | 100 |
この優先度の設定を変更したい場合は、otxadmin の set コマンドで以下の例のように設定します。
※設定の反映は、ドメインの再起動が必要です。
Java VM システムプロパティの優先度変更設定例:
otxadmin> set server.microprofile.microprofile-config.sys-prop-ordinal=200
ここでは、WebOTX Developer にて MicroProfile Config のサンプルアプリケーションを作成する手順について説明します。
作成するアプリケーションは、リクエストで /microprofile-config-sample/config/{プロパティ名} のようにプロパティ名を URL で指定して、 アプリケーション内で定義した micorporilfe-config.properties から該当のプロパティの値を返却します。
ここで作成したアプリケーションは以下よりダウンロードできます。 ダウンロードしたファイルは解凍して、WebOTX Developer にインポートして使用してください。
ダウンロード:microprofile-config-sample.zip
WebOTX Developer を起動し、メニューバーから「ファイル」−「新規」−「その他」を選択します。 次に、以下のようなウィンドウが開くので、「Web」−「動的 Web プロジェクト」を選択して「次へ」ボタンをクリックします。
プロジェクト名を「micorprofile-config-sample」と入力し、「終了」ボタンをクリックします。
プロジェクトの「プロパティ」を開き、以下のように「Java のビルド・パス」−「ライブラリ」−「外部 JAR の追加」をクリックします。
<WebOTX インストールディレクトリ>\WebOTX\modules から microprofile-config-api.jar を選択して、追加します。
追加できたら、「適用して閉じる」ボタンをクリックします。
package com.nec.webotx.samples;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
@ApplicationPath("config")
public class SampleActivator extends Application {
}
ConfigSample クラスを作成し、以下のように記述します。
package com.nec.webotx.samples;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import org.eclipse.microprofile.config.Config;
import org.eclipse.microprofile.config.ConfigProvider;
@Path("/")
public class ConfigSample {
@GET
@Path("/{param}")
public String getProperty(@PathParam("param") String param) {
Config config = ConfigProvider.getConfig();
return config.getValue(param, String.class);
}
}
microprofile-config.properties は Class パスの通った META-INF 配下に配置するため、 以下のよう WEB-INF に classes/META-INF ディレクトリを作成してから配置します。
WebContent
├─META-INF
└─WEB-INF
└──classes
└─META-INF
└─microprofile-config.properties
microprofile-config.properties には、例として以下を記述します。
test=100
プロジェクトを右クリックして、「エクスポート」−「WAR ファイル」を選択します。
「Destination」出力先のパスを指定し、「終了」ボタンをクリックします。
対象の環境に合わせて、アプリケーションを配備します。
コンテナ環境の場合は、[ 構築・運用 > コンテナ型仮想化 ] を参考に、本サンプルアプリケーションを含めたコンテナイメージを作成して、コンテナを起動してください。
コンテナ環境でない場合は、[ 配備 > アプリケーション配備 > 配備・再配備・置換 > 配備・再配備 ] を参考に、配備してください。
例) エージェントプロセス上に配備する場合
otxadmin> deploy (エクスポート時に指定したWARファイル名).war
以下の URLにアクセスすると、microprofile-config.properties で指定した値が表示されます。
http://localhost/microprofile-config-sample/config/test
(8) で取得した値をアプリケーションを修正せずに変更する例として、マイクロサービス起動時に以下のように環境変数を設定します。
docker run -it -d -p 80:80 -e test=200 --name microprofile-config-sample-200 microprofile-config-sample
Docker 起動後に先ほどと同じように以下にリクエストすると、取得される値が 100 から 200 に変わっていることがわかります。
http://localhost/microprofile-config-sample/config/test
このようにして、アプリケーションを修正することなく、 環境変数や Java のシステムプロパティで設定値を変更することができます。
アプリケーションからMicroProfile Config APIを使って接続ホストや認証情報を取得しDBやKVSを利用するための記述例を下記に示します。
package com.nec.webotx.samples;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.MediaType;
import org.eclipse.microprofile.config.inject.ConfigProperty;
import redis.clients.jedis.Jedis;
@Path("/hello")
public class HelloWorldEndpoint {
// DB接続URL
@Inject
@ConfigProperty(name = "hello_db_url")
String dbUrl;
// DB認証ユーザ名
@Inject
@ConfigProperty(name = "hello_db_user")
String dbUser;
// DB認証パスワード
@Inject
@ConfigProperty(name = "hello_db_password")
String dbPassword;
// KVSホスト名
@Inject
@ConfigProperty(name = "hello_kvs_host")
String kvsHost;
// KVSポート番号
@Inject
@ConfigProperty(name = "hello_kvs_port")
Integer kvsPort;
// KVS認証ユーザ名
@Inject
@ConfigProperty(name = "hello_kvs_user")
String kvsUser;
// KVS認証パスワード
@Inject
@ConfigProperty(name = "hello_kvs_password")
String kvsPassword;
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response doGet() {
StringBuilder text = new StringBuilder();
// DB(Oracle)接続例
Connection conn = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection(dbUrl, dbUser, dbPassword);
・・・
} catch (Exception e) {
・・・
} finally {
・・・
}
// KVS(Redis)接続例
Jedis jedis = null;
try {
jedis = new Jedis(kvsHost, kvsPort);
jedis.auth(kvsUser, kvsPassword);
・・・
} catch (Exception e) {
・・・
}finally {
if(jedis != null) try { jedis.close(); } catch (Exception e) {}
}
return Response.ok(text).build();
}
}
設定値
hello_db_url=jdbc:oracle:thin:@{DBホスト名}:{DBポート番号}:{SID}
hello_db_user={DBユーザ名}
hello_db_password={DBパスワード}
hello_kvs_host={KVSホスト名}
hello_kvs_port={KVSポート番号}
hello_kvs_user={KVSユーザ名}
hello_kvs_password={KVSパスワード}