Play Framework,Scala - 仅当有新数据可用时才向客户端发送 websocket 消息

Posted

技术标签:

【中文标题】Play Framework,Scala - 仅当有新数据可用时才向客户端发送 websocket 消息【英文标题】:Play Framework, Scala - sending websocket message to the client only if new data available 【发布时间】:2015-07-24 08:13:21 【问题描述】:

在我的播放框架应用程序(播放 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] 之类的任何内容。

所以我很好奇一个好的解决方案。

提前致谢!

【问题讨论】:

【参考方案1】:

直接解决你的问题是使用Enumeratee.filter:

val outEnumerator = Enumerator.repeatM[String](...) &> Enumeratee.filter[String](s => !s.equals(""))

【讨论】:

太棒了!我现在不了解整个解决方案,但它工作得很好。我在 Enumeratee.filter[String] 中将 [Int] 更改为 [String]。非常感谢。 Enumeratee.filter 创建一个 Enumeratee[E,E] ,它将使用提供的谓词测试每个输入块,如果它满足谓词,它会沿着 iteratee 传递。如果你没问题,你可以接受答案。

以上是关于Play Framework,Scala - 仅当有新数据可用时才向客户端发送 websocket 消息的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Scala 登录 Play Framework?

Play framework + Scala:使用动作组合注入依赖

Play Framework Routes 中的 Scala 反引号

Scala + Play Framework + Slick - Json 作为模型字段

在 Play Framework 2.4 中为 Scala 实现 Akka

在 Play Framework 2.4 中为 Scala 实现 CORS