我正在尋找使用正確的方式打的枚舉(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"
,因爲我想用「一滴」可能是原因,但我錯了問題必須是服務器端,我不知道..
你有正確的問題,但不是很清楚我如何將迭代器/枚舉器範例下推到我的工作者,因爲枚舉器構造函數必須處理一些數據結構,所以我可以創建一個InputStream或一個集合,但兩者都將在枚舉器之外進行處理 – user145634