2

POST リクエスト経由でメッセージを受信する REST サービス (Play Framework 2.0 w/Scala) があります。

ユーザーが Web ページで受信したメッセージのキューを表示できるようにしたいと考えています。ブラウザーとサーバーの間に 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")

}

sendToEnumeratorenumerator(??? の場所) の両方に何を入力する必要がありますか。それとも、代わりに WebSockets と Actors を使用する必要がありますか? (互換性が広いのでSEEを好むので、できればSSEを使いたいです)

4

1 に答える 1

3

わかりました、方法を見つけました:

 // 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")
  }

秘訣は、命令型列挙子を作成することです。この列挙子を使用すると、データが利用可能になったときにデータをプッシュできます。これにより、標準的な手順に従うことができます: 列挙子に基づいてハブを作成し、いくつかの列挙型で変換し、SSE 経由でブラウザに送り返します。

解決策を教えてくれたこのウェブサイトに感謝します:)

于 2012-11-09T19:33:28.633 に答える