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 サーバーをドキュメント通りに作ってみると、こんな感じになると思います。
動きましたが 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()
は使いやすそうだったのでこれを使うようにしてみます。
これで動きました。
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()
のために、 ActorSystem
と Materializer
が要りそうです。
これで動きました。
まとめ
ナウくした結果こうなりました。
終わってから気づいたのですが、 activator の template にある clustered-chat が play 2.5 で websocket と actor を使う例として参考になりそうです。