8.13. 複数の起動可能な JAR インスタンスの Web セッションデータストレージの有効化

web クラスター化アプリケーションを起動可能な JAR としてビルドおよびパッケージ化できます。

要件

  • X.Y.Z.Final-redhat-_BUILD_NUMBER などの最新の Maven プラグインバージョンを確認している。ZBUILD_NUMBER は、JBoss EAP XP 2.0.0 製品のライフサイクル中に進化できます。

  • 2.0.X.GA-redhat-BUILD_NUMBER などの最新の Galleon feature-pack バージョンを確認している。X は JBoss EAP XP 2 のマイクロバージョンで、BUILD_NUMBER は Galleon 機能パックのビルド番号。XBUILD_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>

手順

  1. 以下の内容を 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 セッション共有を有効にします。

  2. 以下の設定を含む 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/> タグは、このサーブレットを複数のサーバーに分散できることを示します。

  3. java ファイルを保存するディレクトリーを作成します。

    $ mkdir -p APPLICATION_ROOT
    /src/main/java/com/example/webclustering/

    APPLICATION_ROOT は、アプリケーションの pom.xml 設定ファイルが含まれるディレクトリーです。

  4. 以下の内容で 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 リクエストを送信するエンドポイントを定義します。

  5. 以下の内容で 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;
        }
    }
  6. アプリケーションをパッケージ化します。

    $ mvn package
  7. オプション: JBoss EAP ベアメタルプラットフォームでアプリケーションを実行するには、JBoss EAP ベアメタルプラットフォームでの起動可能な JAR の使用 にある手順に従いますが、以下の違いがあります。

    1. 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
    2. 検証: ノード 1 インスタンス (http://127.0.0.1:8080/clustering) でアプリケーションにアクセスできます。ユーザーセッション ID とユーザー相関時間を書き留めます。

      このインスタンスを強制終了した後に、ノード 2 インスタンス (http://127.0.0.1:8090/clustering) にアクセスできます。ユーザーは、セッション ID とノード 1 インスタンスのユーザー作成時間と一致する必要があります。

  8. オプション: JBoss EAP OpenShift プラットフォームでアプリケーションを実行するには、JBoss EAP OpenShift プラットフォームでの起動可能な JAR の使用 にある手順に従いますが、以下の手順を完了させてください。

    1. <cloud/> 要素をプラグイン設定に追加します。以下に例を示します。

      <plugins>
         <plugin>
             ... <!-- You must evolve the existing configuration with the <cloud/> element  -->
             <configuration >
                 ...
                 <cloud/>
              </configuration>
          </plugin>
      </plugins>
    2. アプリケーションをリビルドします。

      $ mvn clean package
    3. oc login コマンドを使用して、OpenShift インスタンスにログインします。
    4. OpenShift で新しいプロジェクトを作成します。以下に例を示します。

      $ oc new-project bootable-jar-project
    5. JBoss EAP OpenShift プラットフォームで web-clustering アプリケーションを実行するには、Pod が実行されているサービスアカウントに承認アクセスが付与される必要があります。サービスアカウントは Kubernetes REST API にアクセスできます。以下の例は、サービスアカウントに付与されている認可アクセスを示しています。

      $ oc policy add-role-to-user view system:serviceaccount:$(oc project -q):default
    6. 以下の 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
      1
      target/openshift サブディレクトリーを作成します。パッケージ化されたアプリケーションは openshift サブディレクトリーにコピーされます。
      2
      最新の OpenJDK 11 イメージストリームタグおよびイメージ情報を OpenShift プロジェクトにインポートします。
      3
      web-clustering ディレクトリーおよび OpenJDK 11 イメージストリームに基づいてビルド設定を作成します。
      4
      target/openshift サブディレクトリーをバイナリー入力として使用し、アプリケーションをビルドします。
    7. アプリケーションのデプロイ:

      $ oc new-app web-clustering -e KUBERNETES_NAMESPACE=$(oc project -q)
      
      $ oc expose svc/web-clustering
      重要

      現在の OpenShift namespace の他の Pod を表示するには KUBERNETES_NAMESPACE 環境変数を使用する必要があります。使用しない場合、サーバーは default 名前空間から Pod の取得を試行します。

    8. ルートの URL を取得します。

      $ oc get route web-clustering --template='{{ .spec.host }}'
    9. 直前のコマンドから返された URL を使用して、Web ブラウザーでアプリケーションにアクセスします。以下に例を示します。

      http://ROUTE_NAME/clustering

      ユーザーセッション ID およびユーザー作成時間を書き留めます。

    10. アプリケーションを 2 つの Pod にスケーリングします。

      $ oc scale --replicas=2 deployments web-clustering
    11. 以下のコマンドを実行して、利用可能な OpenShift Pod の一覧を表示し、Pod のビルドステータスを確認します。

      $ oc get pods
    12. oc delete pod web-clustering-POD_NAME コマンドを使用して最も古い Pod を強制終了します。POD_NAME は最も古い Pod の名前です。
    13. アプリケーションを再度アクセスします。

      http://ROUTE_NAME/clustering

      想定される結果: 新規 Pod で生成されるセッション ID および作成時間は、終了した Pod のものに一致します。これは、Web セッションデータストレージが有効になっていることを示します。

関連情報