かんがるーさんの日記

最近自分が興味をもったものを調べた時の手順等を書いています。今は Spring Boot をいじっています。

Spring Boot 2.0.x の Web アプリを 2.1.x へバージョンアップする ( その16 )( JDK を 8u202 → 11.0.2+9 に変更する2 )

概要

記事一覧はこちらです。

Spring Boot 2.0.x の Web アプリを 2.1.x へバージョンアップする ( その15 )( JDK を 8u202 → 11.0.2+9 に変更する ) の続きです。

  • 今回の手順で確認できるのは以下の内容です。
    • Docker で複数の Tomcat を起動する環境と、Windows のサービスから起動する環境を JDK 11 ベースに変更して動作確認します。

参照したサイト・書籍

  1. dockerhub - adoptopenjdk/openjdk11
    https://hub.docker.com/r/adoptopenjdk/openjdk11/

  2. docker-composeでbuildする時にcacheを使わない
    https://qiita.com/setouchi/items/e01557ae4647b8e3b1bc

  3. Introduction to Java 11: Support and JVM Features #jjug
    https://www.slideshare.net/YujiKubota/introduction-to-java-11-support-and-jvm-features

  4. Migration Guide from Java 8 to Java 11
    https://www.slideshare.net/YujiKubota/migration-guide-from-java-8-to-java-11-jjug?next_slideshow=1

  5. Unified JVM Logging
    https://www.slideshare.net/YujiKubota/unified-jvm-logging

  6. 低スペックマシンでJava 11を動かすと、デフォルトのGCはG1GCじゃなくてSerialGCになる
    https://matsumana.info/blog/2018/12/09/java11-g1gc-default/

  7. ざっくりわかった気になるモダンGC入門
    https://blog.cybozu.io/entry/2018/05/29/080000

  8. HotSpot Virtual Machine Garbage Collection Tuning Guide
    https://docs.oracle.com/en/java/javase/11/gctuning/

  9. JVMチューニング: G1GCの使いどころとCMS GCからのマイグレート
    https://x1.inkenkun.com/archives/5506

目次

  1. Docker で複数の Tomcat を起動して動作確認する
    1. docker/app/Dockerfile のベースイメージを adoptopenjdk/openjdk11 に変更する
    2. Docker イメージを作成し直す
    3. 動作確認
  2. Windows のサービスから起動して動作確認する
    1. webapp_startup.bat を変更する
    2. jar ファイルを配置する
    3. サービスに登録する
    4. 動作確認
    5. サービスから削除する

手順

Docker で複数の Tomcat を起動して動作確認する

docker/app/Dockerfile のベースイメージを adoptopenjdk/openjdk11 に変更する

docker/app/Dockerfile の以下の点を変更します。

FROM adoptopenjdk/openjdk11:jdk-11.0.2.9-alpine-slim
RUN apk add --no-cache tzdata
ENV TZ="Asia/Tokyo"
ENV LANG="ja_JP.UTF-8"
VOLUME /tmp
EXPOSE 8080
ENTRYPOINT ["docker-entrypoint.sh"]
  • FROM openjdk:8-jdk-alpineFROM adoptopenjdk/openjdk11:jdk-11.0.2.9-alpine-slim に変更します。

Docker イメージを作成し直す

docker-compose -f docker-compose.app.yml --compatibility rebuild --no-cache コマンドを実行します。

f:id:ksby:20190316173744p:plain

docker image ls ksbysample-webapp-lending コマンドでイメージサイズを確認すると 244MB でした。

f:id:ksby:20190316173905p:plain

動作確認

docker-compose -f docker-compose.app.yml --compatibility up -d コマンドを実行して Tomcat を起動します。

f:id:ksby:20190316180019p:plain

http://localhost:8080/haproxy?stats にアクセスして全てのインスタンスが緑色になるまで待ちます。

f:id:ksby:20190316180416p:plain

以下の手順で動作確認します ( 画面キャプチャは省略します )。

  • ブラウザを起動して http://localhost:8080/ にアクセスしてログイン画面を表示します。tanaka.taro@sample.com / taro でログインします。
  • 検索対象図書館登録画面が表示されます。"東京都" で検索した後、一覧表示されている図書館から「国立国会図書館東京本館」を選択します。
  • ログアウトします。
  • ログイン画面に戻るので suzuki.hanako@test.co.jp / hanako でログインします。
  • 貸出希望書籍 CSV ファイルアップロード画面が表示されます。以下の内容が記述された CSV ファイルをアップロードします。

    "ISBN","書名"
    "978-4-7741-6366-6","GitHub実践入門"
    "978-4-7741-5377-3","JUnit実践入門"
    "978-4-7973-8014-9","Java最強リファレンス"
    "978-4-7973-4778-4","アジャイルソフトウェア開発の奥義"
    "978-4-87311-704-1","Javaによる関数型プログラミング"

  • 「貸出状況を確認しました」のメールが送信されるので、メールに記述されている URL にアクセスします。
  • 貸出申請画面が表示されます。3冊程「申請する」を選択して申請します。
  • ログアウトします。
  • 「貸出申請がありました」のメールが送信されるので、メールに記述されている URL にアクセスします。ログイン画面が表示されるので、tanaka.taro@sample.com / taro でログインします。
  • 貸出承認画面が表示されます。「承認」あるいは「却下」を選択して確定させます。
  • ログアウトします。
  • 「貸出申請が承認・却下されました」のメールが送信されるので、メールに記述されている URL にアクセスします。ログイン画面が表示されるので、suzuki.hanako@test.co.jp / hanako でログインします。
  • 貸出申請結果確認画面が表示されるので内容を確認します。

動作確認は特に問題ありませんでした。

docker-compose -f docker-compose.app.yml --compatibility down コマンドを実行して Tomcat を停止します。

f:id:ksby:20190316185154p:plain

Windows のサービスから起動して動作確認する

webapp_startup.bat を変更する

webapps/ksbysample-webapp-lending/bat/webapp_startup.bat を以下のように変更します。

@echo on

setlocal
set JAVA_HOME=D:\Java\jdk-11.0.2+9
set PATH=%JAVA_HOME%\bin;%PATH%
set WEBAPP_HOME=D:\webapps\ksbysample-webapp-lending
set WEBAPP_JAR=ksbysample-webapp-lending-2.1.3-RELEASE.jar
set LOGS_DIR=%WEBAPP_HOME%\logs
set PATH_HEAPDUMPFILE=%LOGS_DIR%\heapdump.hprof
set PATH_ERRORFILE=%LOGS_DIR%\hs_err.log

cd /d %WEBAPP_HOME%
java -Xms1024m -Xmx1024m ^
     -XX:MaxMetaspaceSize=384m ^
     -XX:+UseParallelGC ^
     -Xlog:gc*=debug:logs/gc.log:time,level,tags:filesize=10m,filecount=5 ^
     -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=%PATH_HEAPDUMPFILE% ^
     -XX:+CrashOnOutOfMemoryError ^
     -XX:ErrorFile=%PATH_ERRORFILE% ^
     -Dsun.net.inetaddr.ttl=100 ^
     -Dcom.sun.management.jmxremote ^
     -Dcom.sun.management.jmxremote.port=7900 ^
     -Dcom.sun.management.jmxremote.ssl=false ^
     -Dcom.sun.management.jmxremote.authenticate=false ^
     -Dspring.profiles.active=product ^
     -jar lib\%WEBAPP_JAR%

set YYYYMMDD=%date:~0,4%%date:~5,2%%date:~8,2%
set HHMMSS=%time:~0,8%
set HHMMSS=%HHMMSS::=%
set HHMMSS=%HHMMSS: =%
if exist %PATH_HEAPDUMPFILE% rename %PATH_HEAPDUMPFILE% heapdump_%YYYYMMDD%%HHMMSS%.hprof
if exist %PATH_ERRORFILE% rename %PATH_ERRORFILE% hs_err_%YYYYMMDD%%HHMMSS%.log
  • set JAVA_HOME=D:\Java\jdk-11.0.2+9 に変更します。
  • set WEBAPP_JAR=ksbysample-webapp-lending-2.0.8-RELEASE.jarset WEBAPP_JAR=ksbysample-webapp-lending-2.1.3-RELEASE.jar に変更します。
  • java コマンドのオプションを以下のように変更します。
    • -server を削除します。64bit 版の JVM ではそもそも不要でした。
    • CMS GC 用の以下のオプションを削除します。
      • -XX:+UseConcMarkSweepGC
      • -XX:+CMSParallelRemarkEnabled
      • -XX:+UseCMSInitiatingOccupancyOnly
      • -XX:CMSInitiatingOccupancyFraction=75
      • -XX:+ScavengeBeforeFullGC
      • -XX:+CMSScavengeBeforeRemark
  • -XX:+UseParallelGC を追加します。JDK 11 のデフォルトの GC は G1 GC ですが、今回はメモリをたいして割り当てないので Parallel GC にします。
  • ログの設定が変更になりましたので、
    • 以下のオプションを削除し、
      • -XX:+PrintGCDetails
      • -XX:+PrintGCTimeStamps
      • -XX:+PrintGCDateStamps
      • -Xloggc:%WEBAPP_HOME%/logs/gc.log
      • -XX:+UseGCLogFileRotation
      • -XX:NumberOfGCLogFiles=5
      • -XX:GCLogFileSize=10M
    • 以下のオプションを追加します。
      • -Xlog:gc*=debug:logs/gc.log:time,level,tags:filesize=10m,filecount=5

変更した webapp_startup.bat を D:\webapps\ksbysample-webapp-lending\bat の下にコピーします。

jar ファイルを配置する

ksbysample-webapp-lending-2.1.3-RELEASE.jar は build 済みなので D:\project-springboot\ksbysample-webapp-lending\build\libs の下にある ksbysample-webapp-lending-2.1.3-RELEASE.jar を D:\webapps\ksbysample-webapp-lending\lib の下に配置します。

D:\webapps\ksbysample-webapp-lending\logs の下にあるログファイルは全て削除します。

サービスに登録する

コマンドプロンプトを「管理者として実行...」モードで起動した後、以下のコマンドを実行します。

> cd /d D:\webapps\ksbysample-webapp-lending\nssm
> nssm.exe install ksbysample-webapp-lending

「NSSM service installer」画面が表示されます。以下の画像の値を入力した後、「Install service」ボタンをクリックします。サービスの登録に成功すると「Service "ksbysample-webapp-lending" installed successfully!」のダイアログが表示されますので「OK」ボタンをクリックします。

f:id:ksby:20190123211425p:plain

  • 「Path」に D:\webapps\ksbysample-webapp-lending\bat\webapp_startup.bat を入力します。
  • 「Startup directory」に D:\webapps\ksbysample-webapp-lending\bat を入力します。

動作確認

サービス画面を開きます。サービス一覧から「ksbysample-webapp-lending」を選択し、「サービスの開始」リンクをクリックしてサービスを開始します。

f:id:ksby:20190317133404p:plain f:id:ksby:20190317133438p:plain

D:\webapps\ksbysample-webapp-lending\logs\ksbysample-webapp-lending.log に Started Application in ... seconds (JVM running for ...) のログが出力されていることを確認します。

動作確認 と同じ手順で動作確認します ( 画面キャプチャは省略します )。

動作確認は特に問題ありませんでした。

サービスから削除する

サービスを削除します。管理者モードで起動しているコマンドプロンプトから以下のコマンドを実行します。

> nssm.exe remove ksbysample-webapp-lending

「Remove the service?」のダイアログが表示されますので、「はい」ボタンをクリックします。サービスが削除されると「Service "ksbysample-webapp-lending" removed successfully!」のダイアログが表示されますので「OK」ボタンをクリックします。

履歴

2019/03/20
初版発行。