什么是Play 2.5.x等同于acceptWithActor [String,JsValue]?

时间:2016-10-03 14:48:06

标签: scala playframework akka

在迁移到Play 2.5.x之前,我经常使用WebSocket.acceptWithActor。现在,当使用不同的输入和输出时,我无法让我的网络套接字保持打开状态,在我的例子中,输入是字符串,输出是JsValue。

Play 2.5.x之前的接收器:

object Application extends Controller {
    def myWebSocket = WebSocket.acceptWithActor[String, JsValue] { request =>
        out => MyActor.props(out)
}

Play 2.5.x中的接收器:

@Singleton
class Application @Inject() (implicit system: ActorSystem, materializer: Materializer) extends Controller {
  implicit val messageFlowTransformer = 
                  MessageFlowTransformer.jsonMessageFlowTransformer[String, JsValue]
  def myWebSocket = WebSocket.accept[String, JsValue] { request =>
    ActorFlow.actorRef(out => MyActor.props(out))
  }
}

在我的演员preStart中紧接着被postStop跟注,所以这显然是不正确的,但我似乎无法在文档中找到任何解决方案(https://www.playframework.com/documentation/2.5.x/ScalaWebSockets) 。 如果我使用WebSocket.accept[String, String]套接字保持打开状态。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

我找到了一个workarround

我的控制器:

    ActorFlow.actorRef[String, JsValue](out =>
      MyActor.props(
         out,
         ...
      )
    ).map(_.toString)

有了这个,你就不定义自定义的messageflowtransformer,而在actor级别,你仍然可以接收字符串并返回JsValues。

答案 1 :(得分:0)

尝试在引号之间发送输入消息,而不是使用纯字符串。就我而言(使用相同的代码)使用工具websocket.org/echo