【发布时间】:2013-11-15 03:24:43
【问题描述】:
我正在寻找在我的代码中使用 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”可能是原因,但我错了,问题一定是服务器端的,我不知道..
【问题讨论】:
标签: scala playframework websocket