Scala 从客户端发送的数据创建枚举器

Scala 从客户端发送的数据创建枚举器,scala,playframework-2.0,Scala,Playframework 2.0,我有一个REST服务(Play Framework 2.0 w/Scala),它通过POST请求接收消息 我希望允许用户查看网页中接收的消息队列。我想在浏览器和服务器之间创建一个SSE通道,以便服务器将新消息推送到浏览器 为了创建SSE流,根据文档,我使用了枚举器/枚举器/迭代对象链 我的问题是:如何将从POST请求接收到的消息注入枚举器。因此,给出如下代码: def receive(msg: String) = Action { sendToEnumerator() Ok } va

我有一个REST服务(Play Framework 2.0 w/Scala),它通过POST请求接收消息

我希望允许用户查看网页中接收的消息队列。我想在浏览器和服务器之间创建一个SSE通道,以便服务器将新消息推送到浏览器

为了创建SSE流,根据文档,我使用了枚举器/枚举器/迭代对象链

我的问题是:如何将从POST请求接收到的消息注入枚举器。因此,给出如下代码:

def receive(msg: String) = Action {
  sendToEnumerator() 
  Ok
}

val enumerator =  Enumerator.fromCallback( ??? )

def sseStream() = Action {

  Ok.stream(enumerator &> anotherEnumeratee ><> EventStrem()).as("text/evetn-stream")

}
def接收(msg:String)=操作{
sendToEnumerator()
好啊
}
val枚举器=枚举器.fromCallback(???)
def sseStream()=操作{
Ok.stream(枚举器&>anotherEnumeratee>EventStrem()).as(“text/evetn stream”)
}
我应该在
sendToEnumerator
enumerator
中输入什么内容(其中???在哪里)。或者我应该只使用WebSocket和Actor吗?(由于兼容性更广,我倾向于使用SEE,因此如果可能,我希望使用SSE)

好的,找到了一种方法:

 // The enum for pushing data to spread to all connected users
  val hubEnum = Enumerator.imperative[String]()

  // The hub used to get multiple output of a common input (the hubEnum)
  val hub = Concurrent.hub[String](hubEnum)

  // Converts message to Json for the web version
  private val asJson: Enumeratee[String, JsValue] = Enumeratee.map[String] {
    text => JsObject(
      List(
        "eventName" -> JsString("eventName"),
        "text" -> JsString(text)
      )
    )
  }

  // loads data into hubEnum
  def receiveData(msg: String) = Action { implicit request =>
    hubEnum push msg
  } 

  // read the Hub iterator and pushes back to clients
  def stream = Action { implicit request =>
     Ok.stream(hub.getPatchCord &> asJson ><> EventSource()).as("text/event-stream")
  }
//用于将数据推送到所有连接用户的枚举
val hubEnum=枚举数。命令式[字符串]()
//用于获取公共输入的多个输出的集线器(hubEnum)
val hub=Concurrent.hub[String](hubEnum)
//将消息转换为web版本的Json
private val asJson:enumerate[String,JsValue]=enumerate.map[String]{
text=>JsObject(
名单(
“eventName”->JsString(“eventName”),
“文本”->JsString(文本)
)
)
}
//将数据加载到hubEnum中
def receiveData(msg:String)=操作{隐式请求=>
hubEnum推送消息
} 
//读取集线器迭代器并将其推回客户端
def stream=操作{隐式请求=>
Ok.stream(hub.getPatchCord&>asJson>EventSource()).as(“文本/事件流”)
}
诀窍是创建一个命令式枚举器。此枚举器允许您在数据可用时将其推入。这样,您就可以按照标准过程进行操作:基于枚举器创建一个Hub,使用一些Enumerate进行转换,然后通过SSE将其发送回浏览器


感谢您给了我解决方案:)

只是建议:上次我构建a'la FB wall页面时,我使用了websockets,它帮了我的忙。@biesior如果可以的话,我想使用SSE,尽管我认为websockets是一种更简单的方法。但由于WebSocket似乎不太受支持。。。