Rob*_*t F 16 scala akka playframework
在我迁移到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)
}
Run Code Online (Sandbox Code Playgroud)
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))
}
}
Run Code Online (Sandbox Code Playgroud)
在我的演员preStart之后立即调用postStop,所以这显然是不正确的,但我似乎无法在文档中找到任何解决方案(https://www.playframework.com/documentation/2.5.x/ScalaWebSockets).如果我使用WebSocket.accept[String, String]套接字保持打开状态.
我究竟做错了什么?
我找到了解决方法
我的控制器:
ActorFlow.actorRef[String, JsValue](out =>
MyActor.props(
out,
...
)
).map(_.toString)
Run Code Online (Sandbox Code Playgroud)
有了这个,您不应该定义自定义消息流转换器,并且在参与者级别您仍然可以接收字符串并返回 JsValues。