コードで play の Enumerator (play.api.libs.iteratee.Enumerator[A]) を使用する適切な方法を探しています。「InfoBlock」タイプのオブジェクトのストリームがあり、それを websocket にリダイレクトしたいと考えています。 .私が実際に行うことは次のとおりです。
ブロックを保持するデータ構造
private lazy val buf:mutable.Queue[InfoBlock] = new mutable.SynchronizedQueue[InfoBlock]
Enumerator で使用されるコールバック
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"
「ブロブ」の使用が原因かもしれないと思ったので、間違っていたので、問題はサーバー側にあるはずで、手がかりがありません..