FURYU Tech Blog - フリュー株式会社

フリュー株式会社の開発者が技術情報を発信するブログです。

Spring Boot アプリケーションの再起動時にハマったこと

こんにちは。フリューのジョンです。

Spring Boot良いですよね。設定が楽ですね。弊社ではマイクロサービスを勧めていく上でSpring Bootを使うことが増えてきました。

ただ、Spring Bootのアプリケーションを再起動する際にkillをしても、たまにプロセスが死なない時があり、再起動に失敗するということがありました。

何かいい方法はないのかなぁと見ていたところ以下が見つかりました。

https://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html

この方法を入れると今までは

$ java ${application}.jar

という感じで起動していましたが

$ service ${好きなプロセス名} start

で起動するようになります。startの他には以下があります

  • stop
  • force-stop
  • restart
  • force-reload
  • status
  • run

この方法で起動するには前準備が必要です。

 

前準備

mavenプロジェクトであればpom.xmlに以下pluginを追加します

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <executable>true</executable>
    </configuration>
</plugin>

次にconfファイルを作成します。ファイル名はjarの名前と同じにしておきます。${application}.conf(confファイルは環境変数に設定してある場合は無くても良いです

APP_NAME=${application}
JAVA_HOME=/usr/local/java/jdk1.8.0_161
JAVA_OPTS="-Dspring.profiles.active=dev"

次にpackagingしたjarファイルをサーバにデプロイし、権限を変えておきます。

$ chmod 755 ${application}.jar

配置したjarと同じ場所に先ほど作成したconfファイルを配置し、その後以下でリンクを作成します。

$ sudo ln -s ${application}.jar /etc/init.d/${好きなプロセス名}

これで終わりです。

 

再起動方法

jarファイルをデプロイした後に、以下コマンドで再起動をしていくことになると思います。

$ service ${好きなプロセス名} restart
.
.
.
test#72|Stopped [17992]CUTING
test#72|Started [18558]CUTING

 

なぜ動くのか

mavenのpluginを入れることでjarファイルの先頭にスクリプトが挿入されます。

このスクリプトがserviceからの起動に対して動くことになります。

参考: Spring Boot の Fully Executable Jar はなぜ動くのか

 

application.ymlに書いた日本語文字列が文字化けする

起動はできたのですが、application.ymlに書いた文字列が文字化けしてしまいました。

そこで先ほど記載したconfのJAVA_OPTSにfile.encodingを追加します。

JAVA_OPTS="-Dspring.profiles.active=dev -Dfile.encoding=UTF-8"

 

まとめ

以上の設定をすることで今までのところ再起動失敗というのはなくなりました。

素敵なマイクロサービス運用、Spring Bootライフを!!

弊社では一緒にサービスを作ってくれるSpringエンジニアを募集しています!!