はじめに

sprayはRESTやHTTPを扱うためのScalaの軽量なライブラリです。また、akkaという別のライブラリも使用しておりアクターモデルを用いて非同期でブロッキングしないアプリケーションを作成可能です。

今回はそのsprayの中からHTTP Serverのためのspray-canを利用してHTTP Serverを立ててみます。公式の説明によれば「spray-canはspray-routingを使ったアプリケーションの完璧なコンテナを作れる!」とのことなのですが、とりあえず今回はspray-canだけに集中して使ってみようと思います。

sprayを使う前提としてakkaやアクターモデルについての理解も少し必要になってきます。 いきなりアクターモデル、と言われてもピンとこないと思うので実例から入るのもいいと思います。アクターモデルについてはこんなスライドもありますので気になる方は合わせてご覧ください。

参考:並行処理初心者のためのAkka入門

spray-canをプロジェクトに取り込む

面倒なのでサクッとIntelliJ IDEAでSBTなプロジェクトを作ってしまいます。

ここを参考に・・・しようにも情報が最低限すぎて自分ではうまく消化できませんでした。結局build.sbtをこんな感じにすることでなんとか動かすことができました。

ちなみにこのタイミングでsbt-revolverも導入しておくと吉です。動作確認とかがものすごくはかどります。

sbt-revolverはプラグインなようなので、プロジェクトのフォルダにあるplugins.sbtに追記します。

あとあと調べたら、たぶんsprayとscalaのバージョンが合ってなかったっぽいです。この辺はspray-templateを参考にしたほうが良いでしょう。

参考:spray-template

リスナーを作る

それでは実際にspray-canのドキュメントを見ながら進めていきましょう。

参考:spray-can / HTTP Server

さて、まずはアプリケーション内でリクエストを受けるリスナーを作ります。 リスナーはActorとして作ります。これをあとでregisterすることで、リクエストが来るとそのActorが呼ばれて通信を処理するようになります。

とは言っても特殊なものを作るわけではありません。普通にActorを作り、接続要求がきたらリクエストを受け付けるという応答を返すようにします。 あとはもし受け取ったのがsprayのHttpRequestであれば、それに応答しています。この時、Pathが”/ping”と一致しているかどうかと、GETメソッドかどうかだけを判定しています。

(ちなみに、ドキュメントにはHttp.Connectedなんて書いておらず、spray-templateを眺めてこの存在に気がつくまでに数時間を無駄にしました・・・)

Http.Bind

リスナーができれば、今度はこれをリスナーとして登録することで、HTTP Serverとして機能させることができます。

ここでは仮にlocalhost:8080で受け付けるように設定してみましょう。

こんな感じで、ActorSystemを作りActorを生成し、そのActorRefをHttp.Bindに渡してやることで以後そのActorが呼ばれることになります。

実行してみる

それではさっそく実行してみましょう。 terminalでsbtを実行し、その中でre-startと叩けばサーバーが動き出します。(初回でもなぜかre-startです)

あとはブラウザで http://localhost:8080/ping を叩けば元気よく PONGが返ってきます。
いかがでしょうか?

WebといえばPHPばかり触っていたのでApacheもなしに応答が返ってくるのは正直不思議な感覚ですが、一度流れを理解してしまえばとても少ない行数でわかりやすくサクッと書けるので病み付きになりそうです。

とはいえまだまだこれだけではあまり役に立つイメージは湧きませんね。次はspray-routing等も使って簡単なREST APIを構築してみようと思います。次はよりsprayの、ひいてはScalaの良さが伝わるでしょう。

さいごに

さて、弊社ではScalaもくもく会というイベントを実施しています。Scalaが気になっている方も、これを読んで興味をもってくれた方も、ただ単に暇な方もぜひ気軽に参加申し込みして参加してくださいね。

第四回が本日6/24(水)、次回も開催予定ですので気になった方はグループに参加して次回の開催情報もお見逃しなく!