2012-11-09 19 views
2

我有一個通過POST請求接收消息的REST服務(Play Framework 2.0 w/Scala)。從客戶端發送數據創建枚舉器

我想允許用戶看到網頁中收到的消息隊列。我想在瀏覽器和服務器之間創建一個SSE通道,以便服務器將新消息推送到瀏覽器。

要創建該SSE流,根據文檔,我使用一個枚舉器/枚舉/ Iteratee鏈。

我的問題是:如何將從POST請求收到的消息注入枚舉器。所以給出這樣的代碼如下:

def receive(msg: String) = Action { 
    sendToEnumerator() 
    Ok 
} 

val enumerator = Enumerator.fromCallback(???) 

def sseStream() = Action { 

    Ok.stream(enumerator &> anotherEnumeratee ><> EventStrem()).as("text/evetn-stream") 

} 

我應該放什麼在這兩個sendToEnumeratorenumerator(其中???是)。或者我應該只使用WebSockets和Actor? (我喜歡因更廣泛的兼容性看,所以想盡可能使用SSE)

+0

只是建議:我最後一次建我用的是網HRS歐洲FB牆頁面的WebSockets http://www.playframework.org/documentation/2.0.4/ScalaWebSockets,它爲我做了詭計。 – biesior

+0

@biesior如果我可以,我想使用SSE,但我看到websockets是一個更簡單的方法。但是由於Websockets似乎不太受支持...... –

回答

3

好了,找到了一種方法:

// The enum for pushing data to spread to all connected users 
    val hubEnum = Enumerator.imperative[String]() 

    // The hub used to get multiple output of a common input (the hubEnum) 
    val hub = Concurrent.hub[String](hubEnum) 

    // Converts message to Json for the web version 
    private val asJson: Enumeratee[String, JsValue] = Enumeratee.map[String] { 
    text => JsObject(
     List(
     "eventName" -> JsString("eventName"), 
     "text" -> JsString(text) 
    ) 
    ) 
    } 

    // loads data into hubEnum 
    def receiveData(msg: String) = Action { implicit request => 
    hubEnum push msg 
    } 

    // read the Hub iterator and pushes back to clients 
    def stream = Action { implicit request => 
    Ok.stream(hub.getPatchCord &> asJson ><> EventSource()).as("text/event-stream") 
    } 

關鍵是要建立一個必要的枚舉。此枚舉器允許您在數據可用時將數據推入。有了這個,你可以按照標準程序:基於枚舉器創建一個Hub,用一些Enumeratee轉換它,並通過SSE發送回瀏覽器。

感謝this website給我解:)

相關問題