WebFluxちょっと記事を寝かせすぎてしまったのですが、今回は1.3でKotlin本体に入ることが決まったコルーチンのお話です。ブロッキング処理として作られているJDBCを使うには一工夫必要です。解決策としては、(この言い回しで合っているのかは自信がないのですが)JDBC処理をSchedulerのelasticでサブスクライブさせ、適時Workerに処理して貰うようにすることで、処理不整合を起こすことなく動かすことができます。https://github.com/seriwb/kotlin-api-sample/blob/master/src/main/kotlin/box/white/seriwb/api/KotlinApiReactiveJdbc.kt#L14実際、プロダクトでWebFluxを使ったときはこの方法で実装し、アプリケーションに対しGatlingで負荷をかけても、この部分ではKOにならなかったため、期待した動作をしているようでした。この方法の問題点しかしこの方法で実装すると、Handlerで応答レスポンスを作るまでは、データをMonoかFluxで持ち回る必要が出てきます。戻り値の型がMonoなどになっていると、メソッドの使い回しがしづらく、呼び出す際もブロッキングを考慮しないといけないため、そこそこの実装難易度となってしまい、結果、kotlinを使っていても理解しづらいコードになってしまいました。これがどうにも気に入らずもやもやしていたのですが、JJUGのナイトセミナーでコルーチンの存在を知り、「コルーチンを使えば良い感じに書けるのでは?」と光明を見出し、コルーチンを使った実装を試してみました。コルーチンコルーチンは軽量スレッドとよく説明されますが、私はスレッド内でJavaScriptの非同期処理を実現する仕組みと理解しています。ブロッキング処理を非同期処理として実行するのにコルーチンが使えるのであれば、これで先ほどの問題を解決できるのではないかと考えた訳です。その他の説明としては、ここの中断可能な計算インスタンスという説明がイメージしやすかったですhttps://qiita.com/k-kagurazaka@github/items/8595ca60a5c8d31bbe37コルーチンの導入コルーチンはまだKotlin自体には組み込まれていないので、利用する場合はライブラリのkotlinx-coroutines-coreを追加する必要があります。Gradleプロジェクトの場合は、以下のように追加します。リクエストでIDを受け取り、それをキーにRDBからデータを取得して、必要なデータを返すAPIをWebFluxとコルーチンで実装すると、以下のようになります。一方でこの関数全体がノンブロッキングである必要があります。このため、Handlerの処理全体をコルーチンの処理として扱い、呼び出し元から見れば一つの処理となるようにしてあります。具体的には、runBlockingで囲まれた部分がコルーチンで動作するので、Handler全体をrunBlockingで囲い、ブロッキング処理となるJDBCアクセスの処理は、asyncブロック内で呼び出し、その結果を利用するときにawaitメソッドを使うようにします。今回はasyncが1つですが、2つ以上の場合は、asyncブロック内の処理結果が実際に必要になるところでawaitをまとめて呼び出すと、asyncの処理が並列で実行されます。次はJDBC側の処理を見てみましょう。Suspending関数を使う関数もSuspendingにasyncブロック内で呼び出していたJDBC処理のgetSimpleResponseData関数は、Suspending関数とするため、suspend修飾子を付与して宣言します。このfindSample関数がSuspending関数だからです。言うとSuspending関数を呼び出すのはSuspending関数内か、asyncブロック内である必要があるからです。suspend修飾子が付いている以外は普通の関数呼び出しの記述になっています。DAOを使うRepositoryの関数内では、Suspending関数も通常の関数呼び出しのように書けるのです。こちらもsuspend修飾子を付けてSuspending関数にするだけで対応が終わります。}}どうでしょうか、これであればKotlinのスッキリさを残したまま、WebFluxを利用できる気がしないでしょうか。通常の呼び出し方ができないことをコードとしても制約を課しているので、誤って呼び出されることを防止しています。なんて便利なんでしょうか・・・コルーチンとWebFluxでどうなったかさて、これまでの話でコルーチンをWebFluxで使うことの利点を感じてもらえたかと思いますが、個人的に利点を上げるとJDBCを使う以上、ブロッキング処理からは逃れられないが、コードは直感的になるそしてノンブロッキングJDBCへの乗り換えも、コルーチン部分を消すだけなのでかなり容易ブロッキング処理が必要ないHandlerでは、WebFluxによりノンブロッキング処理にすることが可能ここらへんが大きなところかと思っています。)参加グループプログラミングはてなブログをはじめよう!seri_wbさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。