質問: PlayFramework2.4のJavaで非同期処理を行おうと考えております。 やりたい事と致しましては、 スレッド1ではHTMLをレンダリングして表示させる。 スレッド2ではAPIを用いた計算処理をおこなう。 スレッド2の処理が重たいためすぐにHTMLで表示をさせたいと考えております。 そして、計算が終了後にAjax等を用いて値を渡して画面に表示させたいです。 上記の要件の場合は下記のようにAkkaを利用する方法がよろしいのでしょうか? いまいち理解ができずに困っております。 わかり易いサンプルコードや理解し易い資料等がありましたらご教授の程宜しく御願い致します。
回答: Akkaを使った非同期レスポンスを使う必要があるのは間違いありません。実は私も2.3でそれをやろうとして結局どうしてもうまく動かせなかったというのがあったばかりなので最終的なやり方まではお示しできないのですが、なぜAkkaが必要になるのかまでご説明します。 まず、HTMLだけ送ってコンテンツはあとからAjaxで遅延取得しよう、というだけのソフトウェア要件なら一般的に非同期処理は不要です。同期的なデータ取得URLを用意すれば十分です。 ところがPlayではそれは許されないのです。Playはリクエストごとにスレッドが立つタイプのフレームワークではなく、固定数の(ときには1本の)スレッドがリクエストを順次処理していくタイプのものだからです。 重い取得処理を同期的にやるとそこでスレッドが止まってしまい、他のリクエストがすべて待たされてしまいます。 そこで、その重い取得処理はラムダ式で書いてそのラムダ式だけさっさと返してしまうというプログラミングをすると、ラムダ式は別スレッドで実行されて結果が終わり次第レスポンスされる、という選択肢が用意されています。 終わり次第レスポンスという動作以外にもOutputStreamオブジェクトを返すことで結果を生成しながら返していくという動作も用意されていてこれをやろうとしたのですが、これが私が使おうとしてうまくいかなかったというやつです。