Java
MySQL
gradle
AmazonLinux
SpringBoot
More than 1 year has passed since last update.

Spring Bootの設定あれこれメモ

Spring Bootでアプリケーションを組んで本番運用することになった時の設定等々を忘れないように簡単にメモしておく。

構成

  • OpenJDK 1.8
  • Spring Boot 1.3.3 (Embedded Tomcat8)
  • MySQL 5.6

ビルドツール
Gradle

アプリケーションサーバー
Amazon EC2(Amazon Linux AMI)

ServiceでSpring Bootを起動

従来通り
java -jar application_name.jar
でアプリケーションを起動しようと考えていたが、Spring Boot 1.3からどうやらServiceで起動できるような機能が実装されたようだったので、それを使用する形で対応してみた。

詳細はこちら
https://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html#deployment-service

対応したこと

1.build.gradle設定変更

bootRepackage {
    executable = true
}

を追加
※これはもしかしたら無くても良いかも。
無くても問題なく起動できるか検証してないです・・・。

2.gradle bootRepackageでjar作成

3.アプリケーションを実行するサーバーにjarをアップロードしてシンボリックリンクを作成
公式ドキュメント通りだが、jarにしたSpringBootアプリケーションをアプリケーションサーバーの何処かにアップ
例)/var/app/something.jar

/etc/init.d/にシンボリックリンクを作成
ln -s /var/app/something.jar /etc/init.d/something
※実行権限とかその辺の設定をきちんとしないと当然ですが起動できないので注意

4.以下のコマンドだけでアプリケーションの起動、停止が可能に
起動
/etc/init.d/something start
停止
/etc/init.d/something stop

おまけ
起動時にjvmのパラメータを付けたり、ログファイルの出力先を変更したいなどオプションを付与してアプリケーションを起動させたい場合
jarを配置した場所に
jar名.conf(something.conf)
を用意することで起動時に自動で読み込んでくれる。

例)
LOG_FOLDER=/var/log/xxxx/
JAVA_OPTS="-Xms512m"

Spring Boot + MySQLで接続が切れる

アプリケーションは動いているがデータを検索できないとの報告がありログを調べたところ、以下のようなメッセージが出ていた。

Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.

どうやら、MySQLで動かしている場合、一定時間アクセスがないと自動でコネクションを切断してしまうらしい。

対応したこと

ちょっと調べて見たところ、既に似たような事象の情報があり、基本的にはそこでの解決策で対応
参考情報
http://yyhayashi303.hatenablog.com/entry/20120911/1347322683
http://stackoverflow.com/questions/22684807/spring-boot-jpa-configuring-auto-reconnect

少し変えたのは
spring.datasource.time-between-eviction-runs-millis=xxxxxx
以外に
spring.datasource.min-evictable-idle-time-millis=xxxx
をパラメータとして追加

これで、min-evictable-idle-time-millis以上アイドルになっているコネクションを対象にtime-between-eviction-runs-millisごとに監視を実行するようになる。

Spring BootにElastic Cacaheを組み込む

Session情報をElastic Cache(memcached)に永続化する際、プロパティで上手くセットをする方法がなかったので、この部分だけはJavaConfigurationで対応

対応したこと

これも調べて見たところ、同様の情報があり、そのまま対応
http://stackoverflow.com/questions/25788969/memcached-with-spring-boot
本当にStack Over Flow様々

1.Elastic Cacheを使うアプリケーションのbuild.gradleにmemcached管理用のjarを追加
https://github.com/magro/memcached-session-manager

  • memcached-session-manager
  • memcached-session-manager-tc8(Embedded Tomcat8で動いているので)

2.Memcachedを管理できるようにJava Configurationを追加

@Bean
public EmbeddedServletContainerFactory tomcat() {
    return new TomcatEmbeddedServletContainerFactory() {
        @Override
        protected void postProcessContext(Context context) {
            MemcachedBackupSessionManager manager = new MemcachedBackupSessionManager();
            manager.setMemcachedNodes("Elastic Cache Endpoint");
            manager.setRequestUriIgnorePattern(".*\\.(ico|png|gif|jpg|css|js)$");
            context.setManager(manager);
        }
    };
}