2013-11-14 69 views
1

我正在尋找使用正確的方式打的枚舉(play.api.libs.iteratee.Enumerator [A])在我的代碼,我有一個類型的對象的流「InfoBlock」和我想將它重定向到一個websocket.What我實際做的是:在playframework使用流,枚舉和支持WebSockets

該數據結構保持所述塊

私人懶惰VAL BUF:mutable.Queue [InfoBlock] =新可變的。 SynchronizedQueue [InfoBlock]

將要使用的回調È枚舉

def getCallback: Future[Option[InfoBlock]] = Future{ 

if (!buf.isEmpty) 
    Some(buf.dequeue) 
else 
    None} 

塊由另一個線程產生並使用添加到隊列:

buf += new InfoBlock(...) 

然後在控制器我想建立一個網頁套接字到流數據,這樣做的:

def stream = WebSocket.using[String]{ request => 

    val in = Iteratee.consume[String]() 

    val enu:Enumerator[InfoBlock] = Enumerator.fromCallback1(
    isFirst => extractor.getCallback 
) 

    val out:Enumerator[String] = enu &> Enumeratee.map(blk => blk.author+" -> "+blk.msg) 

(in,out)} 

它工作但有一個大問題,當一個連接打開它發送一堆塊(=〜50)並停止,如果我打開一個新的websocket,然後我得到另一堆塊,但沒有更多。我試過設置s青梅財產的JS對象特別的WebSocket我嘗試設置

websocket.binaryType = "arraybuffer" 

,因爲我想用「一滴」可能是原因,但我錯了問題必須是服務器端,我不知道..

回答

0

從Enumerator.fromCallback上的枚舉器ScalaDocs描述檢索器功能:

輸入函數。如果有輸入要傳遞,則返回一個最終以「某些」值進行兌換的未來,或者如果已到達流末尾,則最終將以「無」兌換未來。

這意味着枚舉器將首先將所有內容從隊列中拉出。當它爲空時,回調將返回一個無。枚舉器將此視爲流的結束,並關閉發送下游的完成狀態。它不會尋找任何更多的數據

而不是使用可變隊列的消息傳遞,嘗試和推入枚舉器/ Iteratee範例到你的工作。創建一個Enumerator,輸出你正在創建的實例,並從中取得迭代器。如果需要,你可以在中間粘貼一些枚舉來做一些轉換。

+0

你有正確的問題,但不是很清楚我如何將迭代器/枚舉器範例下推到我的工作者,因爲枚舉器構造函數必須處理一些數據結構,所以我可以創建一個InputStream或一個集合,但兩者都將在枚舉器之外進行處理 – user145634