我正在寻找在我的代码中使用 play 枚举器 (play.api.libs.iteratee.Enumerator[A]) 的正确方法,我有一个“InfoBlock”类型的对象流,我想将它重定向到 websocket .我实际上做的是:
保存块的数据结构
私有惰性 val buf:mutable.Queue[InfoBlock] = new mutable.SynchronizedQueue[InfoBlock]
枚举器中使用的回调
def getCallback: Future[Option[InfoBlock]] = Future{
if (!buf.isEmpty)
Some(buf.dequeue)
else
None}
块由另一个线程生成并使用以下命令添加到队列中:
buf += new InfoBlock(...)
然后在控制器中,我想设置一个 websocket 来流式传输该数据,执行以下操作:
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然后我得到另一堆块但没有更多。我试图设置一些属性到 js 对象 WebSocket 特别是我尝试设置
websocket.binaryType = "arraybuffer"
因为我认为使用“blob”可能是原因,但我错了,问题一定是服务器端的,我不知道..