他の誰かが patchPanel を使用して複数の列挙子を組み合わせ、WebSocket を介してクライアントに到達することを願っています。私が直面している問題は、patchPanel が最後に追加された列挙子からのデータ フィードのみを送信していることです。
私は次の例に従いました。http://lambdaz.blogspot.ca/2012/12/play-21-multiplexing-enumerators-into.html patchPanel に関して私が見つけた唯一のリファレンスです。
バージョン; 遊ぶ!2.1.1 (Java 1.7.0_11 および Scala 2.10.0 を使用)
Web ソケット方式。
def monitorStream = WebSocket.async[JsValue] { request =>
val promiseIn = promise[Iteratee[JsValue, Unit]]
val out = Concurrent.patchPanel[JsValue] { patcher =>
val in = Iteratee.foreach[JsValue] { json =>
val event:Option[String] = (json \ "event").asOpt[String]
val systemId = (json \ "systemId").as[Long]
event.getOrElse("") match {
case "join" =>
val physicalSystem = SystemIdHandler.getById(systemId)
val monitorOut = (MonitorStreamActor.joinMonitor(physicalSystem))
monitorOut map { enum =>
val success = patcher.patchIn(enum)
}
}
}.mapDone { _ => Logger.info("Disconnected") }
promiseIn.success(in)
}
future(Iteratee.flatten(promiseIn.future),out)
}
MonitorStreamActor 呼び出し。
def joinMonitor(physicalSystem: PhysicalSystem):
scala.concurrent.Future[Enumerator[JsValue]]
= {
val monitorActor = ActorBase.akkaSystem.actorFor("/user/system-" + physicalSystem.name +"/stream")
(monitorActor ? MonitorJoin()).map {
case MonitorConnected(enumerator) =>
enumerator
}
}
列挙子は正常に返され、そこに供給されるデータはアクターを呼び出すタイマーからのものです。アクター定義、タイマーは UpdatedTranStates ケースにヒットします。
class MonitorStreamActor() extends Actor {
val (monitorEnumerator, monitorChannel) = Concurrent.broadcast[JsValue]
import play.api.Play.current
def receive = {
case MonitorJoin() => {
Logger.debug ("Actor monitor join")
sender ! MonitorConnected(monitorEnumerator)
}
case UpdatedTranStates(systemName,tranStates) => {
//println("Got updated Tran States")
val json = Json.toJson(tranStates.map(m => Map("State" -> m._1, "Count" -> m._2) ))
//println("Pushing updates to monitorChannel")
sendUpdateToClients(systemName, "states", json)
}
def sendUpdateToClients(systemName:String, updateType:String, json:JsValue) {
monitorChannel.push(Json.toJson(
Map(
"dataType"->Json.toJson(updateType),
"systemName" -> Json.toJson(systemName),
"data"->json)))
}
}
}
これについてしばらく調べてみましたが、 patchPanel に追加された最後の列挙子だけにデータが送信される理由が見つかりませんでした。APIドキュメントはあまり役に立ちません.patchInを呼び出すだけで、すべての列挙子を反復子に結合する必要があるように思えますが、そうではないようです.