2016-10-03 34 views
16

在我遷移到Play 2.5.x之前,我經常使用WebSocket.acceptWithActor。現在我不能讓我的網絡套接字在使用不同的輸入和輸出時保持打開狀態,在我的情況下,輸入是字符串,輸出是JsValue。什麼是Play 2.5.x等價於acceptWithActor [String,JsValue]?

播放2.5.X之前我接收器:

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

我在玩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

嗨,你找到解決辦法嗎? – SergiGP

+0

不幸的是,我使用'WebSocket.accept [String,String]' –

+0

去看看我的答案,它很髒,但也許它可以爲你工作:) – SergiGP

回答

1

我發現一個workarround

我的控制器:

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

有了這個,你shouln't定義自定義messageflowtransformer和演員的水平,你仍然可以接收串並返回JsValues。

相關問題