フリューのジョンです。Bootアプリケーションのserviceでの起動について触れました。アプリケーションの再起動時にハマったことしかし、上記はCentOS6での話でした。CentOS7になるとより柔軟なサービスの管理ができます。statusでサービスの状態がわかる(いつ起動したのかなどもわかります)後述する、ユニットファイルの設定によって起動の依存を記述することができる(あるサービスが起動していなければ動かさないなど起動時、停止時に呼ばれるスクリプトを指定することができる実際に複雑なマイクロサービスを作っていく上では欲しい機能になるかと思います。前回のものとの比較になりますが2点が異なるのみです。中身は以下のようになります。restartCentOS7では、systemctlコマンドを利用します。${好きなプロセス名}この2点だけです。それ以外のconfファイルの書き方、配置などは全く変わりません。ログが吐き出されます。そのため、アプリケーションのログは別に出しているし、ここに吐き出されたくない場合はユニットファイルのServiceに以下を追加します。StandardError=null12StandardOutput=nullStandardError=nullまとめsystemctlコマンドによる起動で再起動スクリプトを自作する必要もありません(serviceによる起動でも同じですがマイクロサービスを進めていくには、インフラ回りについてきちんと勉強していく必要があると感じます。2系でのリリースについて若干変更がありましたのでページを作りました。フリューのジョンです。Boot良いですよね。Bootを使うことが増えてきました。Bootのアプリケーションを再起動する際にkillをしても、たまにプロセスが死なない時があり、再起動に失敗するということがありました。何かいい方法はないのかなぁと見ていたところ以下が見つかりました。startで起動するようになります。startの他には以下がありますstopforce-stoprestartforce-reloadstatusrunこの方法で起動するには前準備が必要です。</plugin>1234567<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><executable>true</executable></configuration></plugin>次にconfファイルを作成します。ファイル名はjarの名前と同じにしておきます。JAVA_OPTS="-Dspring.profiles.active=dev"123APP_NAME=${application}JAVA_HOME=/usr/local/java/jdk1.8.0_161JAVA_OPTS="-Dspring.profiles.active=dev"次にpackagingしたjarファイルをサーバにデプロイし、権限を変えておきます。${application}.jar配置したjarと同じ場所に先ほど作成したconfファイルを配置し、その後以下でリンクを作成します。/etc/init.d/${好きなプロセス名}これで終わりです。再起動方法jarファイルをデプロイした後に、以下コマンドで再起動をしていくことになると思います。[18558]CUTINGなぜ動くのかmavenのpluginを入れることでjarファイルの先頭にスクリプトが挿入されます。このスクリプトがserviceからの起動に対して動くことになります。動くのかapplication.ymlに書いた日本語文字列が文字化けする起動はできたのですが、application.ymlに書いた文字列が文字化けしてしまいました。そこで先ほど記載したconfのJAVA_OPTSにfile.encodingを追加します。-Dfile.encoding=UTF-8"まとめ以上の設定をすることで今までのところ再起動失敗というのはなくなりました。フリューのジョンです。最近はVue.jsがあればテンプレートエンジンなんていらないと思いながらThymeleafを触っています。Securityを使ったAjax通信についてハマったのでそれの解消方法について書かせていただきます。Securityの機能の一つである、クロスサイトスクリプティング防止機能でハマりました。クロスサイトスクリプティングの説明については、今回省きます。他サイトを参照してください。環境は以下のとおりです。Securityを導入すると、単純なPOSTアクセスをすることができなくなります。理由としては、認可した場所からのリクエストであることを検証するためにトークンが必要になるためです。その為、これを解消するには以下の方法があります。Formにトークンを付ける。Cookieにトークンをつけて、リクエストヘッダにトークンをつけて送信する。ダメゼッタイ、ユルサナイ上手くいかない例まずうまくいかない、例を見てみましょう。"test";}}この状態でボタンを叩くと以下のような画面になります。Security+Thymeleafを導入すると簡単に対応できます。具体的にはFormのaction属性をThymeleafのものにします。value="100"><button>post</button></form></body>Formタグを見てみると自動でinput[type=’hidden’]が追加されているのがわかると思います。Ajaxにする場合、このinput[name=’_csrf’]の値をJavaScriptで取得すれば良いのです。この方法はFormタグがなければ成り立ちません。FormがないAjaxのpost通信をするためには、以下の方法があります。Securityでは、Cookieにトークンをつけることができます。そのためには、CookieCsrfTokenRepositoryを使用します。{http.authorizeRequests().......and().csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());}}withHttpOnlyFalseとしているのは、HTTPでもCookieにトークンをつけてもらうためです(デフォルトはHTTPSだけにしかCookieは付いてきません)。リクエストを見てみると、以下のようにXSRF-TOKENという名前のCookieがついているのがわかります。このCookieの値をJavaScriptで読み込み、リクエストヘッダにX-XSRF-TOKENをつけます。console.log('fail'));}}})</script></body>これによりAjax通信が可能になります。いちいちCookieをとってリクエストヘッダに渡すのは面倒ですね。Axiosというライブラリではそれを解消してくれます。内部でcookie()を見て、リクエストヘッダに追加してくれているのです。console.log('fail'));}非常に便利ですね。Cookieの名前、ヘッダの名前は、デフォルトの値ですので、変更可能です。Axiosの方も変更が可能です。SecurityでのAjaxのlogin機能を実装しようとした時、すこし、ハマりましたので追記します。Axiosで通信するとデフォルトはJsonでの通信になります。loginには、FormDataでパラメータを渡さなければいけません。実装方法としては、以下のようにAxiosのpostメソッドの第3パラメータに変換メソッドを追加してあげます。Securityを使ったajax通信は少しだけ工夫が必要です。その設定は本当に少しだけです。Securityは本当に素晴らしいので、ぜひ使ってみてください。Ajax通信だけのために、jQueryを使うのは止めましょう。Axiosを使ってみましょう。フリューのジョンです。JPAのほうが好きですが、今回はDoma2を使った複数データベースアクセスを実装して躓いたので書かせていただきたいと思います。環境としましては以下のようになります。1.5.4.RELEASE複数のデータベースアクセスの具体的な要件は以下になります。oracle.jdbc.OracleDriver以上の要件を満たすために、AbstractRoutingDataSourceとAnnotation、ThreadLocalを利用しました。Bootで複数データベースを扱うウェブアプリケーションのサンプル」の記事を参考にさせていただきました。実装Daoには実装は加えません。肝になるのは、AbstractRoutingDataSourceです。AbstractRoutingDataSourceはSpringのJDBCパッケージの中にあります。このクラスを実装したモノを、Domaのconfigを継承したConfigrationクラスが返却することで対応が可能です。DataSourceBuilder.create().build();}}ここで、AppConfigはルートである必要があります。(もしかすると、そうでなくてもいける方法があるのかもしれませんが、私が調べた限り出来ませんでした......)接続先を保存するためにstaticでデータを作っておきます。ThreadLocalですので取扱には注意です。DataSourceType.TEST;}アノテーションの実装は以下になります。アノテーションがあるメソッドが動く前に接続先をHolderにセットして、動作した後に開放しています。{MultiDataSourceContextHolder.clearTenantType();}}}接続先はenumで持つようにします。name;}ここまでで実装終わりです。以下のようになります。DBアクセスするなんとか}}まとめ今回はアノテーションを使った振り分け方を行いましたが、リクエストパラメータやCookieを使って振り分けるというのも良いかと思います。Doma2がConfigを勝手に参照してくれるのは、とても楽ですね。設定だけでうまくいきました。