Scala Concurrent.patchPanel不从多个枚举器发送数据-仅从添加的最后一个枚举器发送数据
我希望其他人已经使用patchPanel将多个枚举器组合在一起,通过websocket发送给客户机。我遇到的问题是patchPanel只发送最后添加到其中的枚举数的数据提要 我仿效了美国的榜样;这是我能找到的关于配线架的唯一参考资料 版本;玩2.1.1(使用Java 1.7.0_11和Scala 2.10.0) web套接字方法Scala Concurrent.patchPanel不从多个枚举器发送数据-仅从添加的最后一个枚举器发送数据,scala,playframework,playframework-2.1,Scala,Playframework,Playframework 2.1,我希望其他人已经使用patchPanel将多个枚举器组合在一起,通过websocket发送给客户机。我遇到的问题是patchPanel只发送最后添加到其中的枚举数的数据提要 我仿效了美国的榜样;这是我能找到的关于配线架的唯一参考资料 版本;玩2.1.1(使用Java 1.7.0_11和Scala 2.10.0) web套接字方法 def monitorStream = WebSocket.async[JsValue] { request => val promiseIn = promi
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
}
}
枚举数返回良好,输入它的数据来自调用actor的计时器。参与者定义,计时器点击更新的Transtates案例
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)))
}
}
}
我已经在这个问题上探索了一段时间,还没有找到为什么只有添加到配线架中的最后一个枚举器才会发送数据的原因。API文档没有多大帮助,听起来你所要做的就是调用patchIn,它应该将所有枚举数组合到一个迭代器中,但情况似乎并非如此。PatchPanel by design用patchIn方法提供的新枚举数替换当前枚举数 为了将多个枚举数组合在一起,需要使用interleave或and方法将枚举数组合在一起。在这种情况下,交错是首选的,因为它将从每个枚举器中获取可用的事件,而不是清空一个然后移动到下一个(与andThen运算符一样) 即,在监视器流中
val monitorOut = (MonitorStreamActor.joinMonitor(physicalSystem))
monitorOut map { enum =>
mappedEnums += ((physicalSystem.name, enum))
patcher.patchIn(Enumerator.interleave[JsValue]( mappedEnums.values.toSeq))
}
patcher是补丁面板,mappedEnums是HashMap[String,Enumerator[JsValue]]-每次更改枚举数(添加或删除)时重新添加补丁程序-它可以工作,不确定这是否是最好的方法,但现在可以:)是的,patchPannel只会用新的枚举数替换当前的枚举数(我是原博文的作者,为我的错误感到抱歉;)对于未来的读者,我已经用一篇新博文替换了我的旧博文(参见与问题相关的“混合子流”一节)