2016-10-03 9 views
16

Przed przeniesieniem do wersji 2.5.x często korzystałem z WebSocket.acceptWithActor. Teraz nie mogę dostać moich gniazd sieciowych, aby pozostać otwarte przy użyciu różnych danych wejściowych i wyjściowych, w moim przypadku, wejście jest String, wyjście to JsValue.Co to jest odpowiednik w Play 2.5.x dla acceptWithActor [String, JsValue]?

Mój odbiornik przed play 2.5.x:

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

Mój odbiornik w grze 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)) 
    } 
} 

W moim aktor preStart jest wywoływana natychmiast następuje postStop, więc jest to oczywiście nieprawidłowe , ale nie mogę znaleźć żadnego rozwiązania w dokumentacji (https://www.playframework.com/documentation/2.5.x/ScalaWebSockets). Jeśli użyję WebSocket.accept[String, String], gniazdo pozostanie otwarte.

Co robię źle?

+0

Witam, znalazłeś rozwiązanie tego? – SergiGP

+0

Niestety nie, poszedłem za pomocą 'WebSocket.accept [String, String]' –

+0

spójrz na moją odpowiedź, jest brudna, ale może zadziała dla ciebie :) – SergiGP

Odpowiedz

1

Znalazłem workarround

mojego kontrolera:

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

Z tego shouln't zdefiniować niestandardową messageflowtransformer i na poziomie aktora można nadal odbierać sznurki i powrotu JsValues.

Powiązane problemy