Scala Play 2.5でActor使うWebSocketサーバーをドキュメント通りに作ったらdeprecatedだったのでなんとかした

Play Framework 2.5.x 公式ドキュメントの WebSockets のページ を見ながら試しに作ってみたのですが、これだと deprecated なメソッドが使われておりナウくないようなので、ナウくしました。

追記:ほどなくしてナウく書き直されていたのでもう大丈夫そうです Update Scala WebSocket documentation for 2.5 · playframework/playframework@3007a5a

ドキュメント通りに作った結果

たとえば、 {"ping": "hoge"} を投げると {"pong": "hoge"} が返ってくる簡単な WebSocket サーバーをドキュメント通りに作ってみると、こんな感じになると思います。

gist.github.com

動きましたが deprecated なメソッドが2つあるようです。

WebSocket.acceptWithActor() が deprecated

acceptWithActor() が Play 2.5.0 から deprecated になっています。

Deprecated (Since version 2.5.0) Use accept with a flow that wraps a Sink.actorRef and Source.actorRef, or play.api.libs.Streams.ActorFlow.actorRef

Sink.actorRef()Source.actorRef() を flow でラップする、という方法はわかりませんでした。誰か教えてください。 ActorFlow.actorRef() は使いやすそうだったのでこれを使うようにしてみます。

gist.github.com

これで動きました。

play.api.Play.current が deprecated

current が Play 2.5.0 から deprecated になっています。

Deprecated (Since version 2.5.0) This is a static reference to application, use DI instead

Dependency Injection しなさいと書かれているので、そのように WebSocketController を修正します。 ActorFlow.actorRef() のために、 ActorSystemMaterializer が要りそうです。

gist.github.com

これで動きました。

まとめ

ナウくした結果こうなりました。

gist.github.com

終わってから気づいたのですが、 activator の template にある clustered-chat が play 2.5 で websocket と actor を使う例として参考になりそうです。

github.com