Play Framework, Scala - 仅在新数据可用时才向客户端发送 websocket 消息
Play Framework, Scala - sending websocket message to the client only if new data available
在我的播放框架应用程序(播放2.4.1)中,我使用WebSocket 向客户端发送连续数据。目前,无论用户的新数据是否可用,我的例程每 10 秒向客户端发送一条消息。
如果没有可用的新数据,例程将发送一个空字符串。合理的是,只有在有新数据可用时,我才会发送消息。如果没有可用的新数据,则不需要消息。
我如何在 Scala 中执行此操作?
def websocket() = WebSocket.using[String] {
request =>
// get session user
val user = request.session.get("user") match {
case Some(s) => s.toString
case _ => " "
}
Logger.info(s"[ap] websocket, client $user connected.")
val outEnumerator = Enumerator.repeatM[String](Promise.timeout({
// check for new trigger entry for the user
val resultString = Trigger.findByPersonnelNumber(user) match {
case None => ""
case _ => Trigger.delete(user)
val orders = Order.findByUser(user)
Json.stringify(Json.toJson(orders))
}
resultString
}, 10000))
(Iteratee.ignore[String], outEnumerator)
}
如果 resultString 为空,则类似于 outEnumerator.ignore[String]。
所以我很好奇一个好的解决方案。
提前致谢!
解决您问题的直接方法是使用 Enumeratee.filter
:
val outEnumerator = Enumerator.repeatM[String](...) &> Enumeratee.filter[String](s => !s.equals(""))
在我的播放框架应用程序(播放2.4.1)中,我使用WebSocket 向客户端发送连续数据。目前,无论用户的新数据是否可用,我的例程每 10 秒向客户端发送一条消息。
如果没有可用的新数据,例程将发送一个空字符串。合理的是,只有在有新数据可用时,我才会发送消息。如果没有可用的新数据,则不需要消息。
我如何在 Scala 中执行此操作?
def websocket() = WebSocket.using[String] {
request =>
// get session user
val user = request.session.get("user") match {
case Some(s) => s.toString
case _ => " "
}
Logger.info(s"[ap] websocket, client $user connected.")
val outEnumerator = Enumerator.repeatM[String](Promise.timeout({
// check for new trigger entry for the user
val resultString = Trigger.findByPersonnelNumber(user) match {
case None => ""
case _ => Trigger.delete(user)
val orders = Order.findByUser(user)
Json.stringify(Json.toJson(orders))
}
resultString
}, 10000))
(Iteratee.ignore[String], outEnumerator)
}
如果 resultString 为空,则类似于 outEnumerator.ignore[String]。
所以我很好奇一个好的解决方案。
提前致谢!
解决您问题的直接方法是使用 Enumeratee.filter
:
val outEnumerator = Enumerator.repeatM[String](...) &> Enumeratee.filter[String](s => !s.equals(""))