在迁移到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]
套接字保持打开状态。
我做错了什么?
答案 0 :(得分:1)
我找到了一个workarround
我的控制器:
ActorFlow.actorRef[String, JsValue](out =>
MyActor.props(
out,
...
)
).map(_.toString)
有了这个,你就不定义自定义的messageflowtransformer,而在actor级别,你仍然可以接收字符串并返回JsValues。
答案 1 :(得分:0)
尝试在引号之间发送输入消息,而不是使用纯字符串。就我而言(使用相同的代码)使用工具websocket.org/echo