8.13. 複数の起動可能な JAR インスタンスの Web セッションデータストレージの有効化
web クラスター化アプリケーションを起動可能な JAR としてビルドおよびパッケージ化できます。
要件
X.Y.Z.Final-redhat-_BUILD_NUMBER
などの最新の Maven プラグインバージョンを確認している。Z と BUILD_NUMBER は、JBoss EAP XP 2.0.0 製品のライフサイクル中に進化できます。- X は、Maven プラグインのメジャーバージョンです。
- y は、Maven プラグインのマイナーバージョンです。
- z は、Maven プラグインのマイクロバージョンです。/ga/org/wildfly/plugins/wildfly-jar-maven-plugin のインデックス を参照してください。
-
2.0.X.GA-redhat-BUILD_NUMBER
などの最新の Galleon feature-pack バージョンを確認している。X は JBoss EAP XP 2 のマイクロバージョンで、BUILD_NUMBER は Galleon 機能パックのビルド番号。X と BUILD_NUMBER は、JBoss EAP XP 2.0.0 製品のライフサイクル中に進化できます。Index of /ga/org/jboss/eap/wildfly-galleon-pack のインデックス を参照してください。 Maven プロジェクトを作成し、親依存関係を設定して、web-clustering アプリケーションを作成するための依存関係を追加している。起動可能な JAR Maven プロジェクトの作成 を参照してください。
重要Maven プロジェクトを設定する場合は、Maven archetype 設定で値を指定する必要があります。以下に例を示します。
$ mvn archetype:generate \ -DgroupId=com.example.webclustering \ -DartifactId=web-clustering \ -DarchetypeGroupId=org.apache.maven.archetypes \ -DarchetypeArtifactId=maven-archetype-webapp \ -DinteractiveMode=false cd web-clustering
注記この手順の例では、以下のプロパティーを指定します。
-
Maven プラグインバージョンの場合は、
${bootable.jar.maven.plugin.version}
です。 -
Galleon 機能パックバージョンの場合は、
${jboss.xp.galleon.feature.pack.version}
です。
これらのプロパティーをプロジェクトで設定する必要があります。以下に例を示します。
<properties> <bootable.jar.maven.plugin.version>2.0.2.Final-redhat-00001</bootable.jar.maven.plugin.version> <jboss.xp.galleon.feature.pack.version>2.0.0.GA-redhat-00002</jboss.xp.galleon.feature.pack.version> </properties>
-
Maven プラグインバージョンの場合は、
手順
以下の内容を
pom.xml
ファイルの<build>
要素に追加します。最新バージョンの Maven プラグインと、org.jboss.eap:wildfly-galleon-pack
Galleon 機能パックの最新バージョンを指定する必要があります。以下に例を示します。<plugins> <plugin> <groupId>org.wildfly.plugins</groupId> <artifactId>wildfly-jar-maven-plugin</artifactId> <version>${bootable.jar.maven.plugin.version}</version> <configuration> <feature-pack-location>org.jboss.eap:wildfly-galleon-pack:${jboss.xp.galleon.feature.pack.version}</feature-pack-location> <layers> <layer>datasources-web-server</layer> <layer>web-clustering</layer> </layers> </configuration> <executions> <execution> <goals> <goal>package</goal> </goals> </execution> </executions> </plugin> </plugins>
注記この例では、
web-clustering
Galleon レイヤーを使用して Web セッション共有を有効にします。以下の設定を含む
src/main/webapp/WEB-INF
ディレクトリーにweb.xml
ファイルを作成します。<?xml version="1.0" encoding="UTF-8"?> <web-app version="4.0" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"> <distributable/> </web-app>
<distributable/>
タグは、このサーブレットを複数のサーバーに分散できることを示します。java ファイルを保存するディレクトリーを作成します。
$ mkdir -p APPLICATION_ROOT /src/main/java/com/example/webclustering/
APPLICATION_ROOT
は、アプリケーションのpom.xml
設定ファイルが含まれるディレクトリーです。以下の内容で Java ファイル
MyServlet.java
を作成し、ファイルをAPPLICATION_ROOT/src/main/java/com/example/webclustering/
ディレクトリーに保存します。package com.example.webclustering; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet(urlPatterns = {"/clustering"}) public class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("text/html;charset=UTF-8"); long t; User user = (User) request.getSession().getAttribute("user"); if (user == null) { t = System.currentTimeMillis(); user = new User(t); request.getSession().setAttribute("user", user); } try (PrintWriter out = response.getWriter()) { out.println("<!DOCTYPE html>"); out.println("<html>"); out.println("<head>"); out.println("<title>Web clustering demo</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>Session id " + request.getSession().getId() + "</h1>"); out.println("<h1>User Created " + user.getCreated() + "</h1>"); out.println("<h1>Host Name " + System.getenv("HOSTNAME") + "</h1>"); out.println("</body>"); out.println("</html>"); } } }
MyServlet.java
の内容は、クライアントが HTTP リクエストを送信するエンドポイントを定義します。以下の内容で Java ファイル
User.java
を作成し、ファイルをAPPLICATION_ROOT/src/main/java/com/example/webclustering/
ディレクトリーに保存します。package com.example.webclustering; import java.io.Serializable; public class User implements Serializable { private final long created; User(long created) { this.created = created; } public long getCreated() { return created; } }
アプリケーションをパッケージ化します。
$ mvn package
オプション: JBoss EAP ベアメタルプラットフォームでアプリケーションを実行するには、JBoss EAP ベアメタルプラットフォームでの起動可能な JAR の使用 にある手順に従いますが、以下の違いがあります。
JBoss EAP ベアメタルプラットフォームでは、以下の例のように、
java -jar
コマンドを使用して複数の起動可能な JAR インスタンスを実行できます。$ java -jar target/web-clustering-bootable.jar -Djboss.node.name=node1 $ java -jar target/web-clustering-bootable.jar -Djboss.node.name=node2 -Djboss.socket.binding.port-offset=10
検証: ノード 1 インスタンス (http://127.0.0.1:8080/clustering) でアプリケーションにアクセスできます。ユーザーセッション ID とユーザー相関時間を書き留めます。
このインスタンスを強制終了した後に、ノード 2 インスタンス (http://127.0.0.1:8090/clustering) にアクセスできます。ユーザーは、セッション ID とノード 1 インスタンスのユーザー作成時間と一致する必要があります。
オプション: JBoss EAP OpenShift プラットフォームでアプリケーションを実行するには、JBoss EAP OpenShift プラットフォームでの起動可能な JAR の使用 にある手順に従いますが、以下の手順を完了させてください。
<cloud/>
要素をプラグイン設定に追加します。以下に例を示します。<plugins> <plugin> ... <!-- You must evolve the existing configuration with the <cloud/> element --> <configuration > ... <cloud/> </configuration> </plugin> </plugins>
アプリケーションをリビルドします。
$ mvn clean package
-
oc login
コマンドを使用して、OpenShift インスタンスにログインします。 OpenShift で新しいプロジェクトを作成します。以下に例を示します。
$ oc new-project bootable-jar-project
JBoss EAP OpenShift プラットフォームで web-clustering アプリケーションを実行するには、Pod が実行されているサービスアカウントに承認アクセスが付与される必要があります。サービスアカウントは Kubernetes REST API にアクセスできます。以下の例は、サービスアカウントに付与されている認可アクセスを示しています。
$ oc policy add-role-to-user view system:serviceaccount:$(oc project -q):default
以下の
oc
コマンドを入力してアプリケーションイメージを作成します。$ mkdir target/openshift && cp target/web-clustering-bootable.jar target/openshift 1 $ oc import-image ubi8/openjdk-11 --from=registry.redhat.io/ubi8/openjdk-11 --confirm 2 $ oc new-build --strategy source --binary --image-stream openjdk-11 --name web-clustering 3 $ oc start-build web-clustering --from-dir target/openshift 4
アプリケーションのデプロイ:
$ oc new-app web-clustering -e KUBERNETES_NAMESPACE=$(oc project -q) $ oc expose svc/web-clustering
重要現在の OpenShift namespace の他の Pod を表示するには
KUBERNETES_NAMESPACE
環境変数を使用する必要があります。使用しない場合、サーバーはdefault
名前空間から Pod の取得を試行します。ルートの URL を取得します。
$ oc get route web-clustering --template='{{ .spec.host }}'
直前のコマンドから返された URL を使用して、Web ブラウザーでアプリケーションにアクセスします。以下に例を示します。
http://ROUTE_NAME/clustering
ユーザーセッション ID およびユーザー作成時間を書き留めます。
アプリケーションを 2 つの Pod にスケーリングします。
$ oc scale --replicas=2 deployments web-clustering
以下のコマンドを実行して、利用可能な OpenShift Pod の一覧を表示し、Pod のビルドステータスを確認します。
$ oc get pods
-
oc delete pod web-clustering-POD_NAME
コマンドを使用して最も古い Pod を強制終了します。POD_NAME は最も古い Pod の名前です。 アプリケーションを再度アクセスします。
http://ROUTE_NAME/clustering
想定される結果: 新規 Pod で生成されるセッション ID および作成時間は、終了した Pod のものに一致します。これは、Web セッションデータストレージが有効になっていることを示します。
関連情報
- 分散可能な Web セッション管理プロファイルの詳細は、開発ガイドの 分散可能な Web セッション設定の distributable-web サブシステム を参照してください。
- JGroups プロトコルスタックの設定の詳細は、JBoss EAP for OpenShift Container Platform のスタートガイドの JGroups 検出メカニズムの設定 を参照してください。