Что такое эквивалент Play 2.5.x для acceptWithActor [String, JsValue]?
До того, как я перешел на Play 2.5.x, я часто использовал WebSocket.acceptWithActor
. Теперь я не могу заставить свои веб-сокеты оставаться открытыми при использовании разных входных и выходных данных, в моем случае вход - String, вывод - JsValue.
Мой приемник перед воспроизведением 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]
, сокет остается открытым.
Что я делаю неправильно?
Ответы
Ответ 1
Я нашел рабочий стол
Мой контроллер:
ActorFlow.actorRef[String, JsValue](out =>
MyActor.props(
out,
...
)
).map(_.toString)
С этим вы не определяете настраиваемый преобразователь сообщений и на уровне актера вы все равно можете получать строки и возвращать JsValues.