在Play 2.1中,使用什么而不是弃用的PushEnumerator

时间:2013-01-29 17:05:14

标签: scala playframework-2.1

PushEnumerator在Play framework 2.1-RC中已弃用。 该文档告诉我使用Concurrent.broadcast。但是,我推送的数据依赖于用户,因此我无法向每个用户广播相同的数据。

换句话说,Concurrent.broadcast将为我提供一个连接到许多迭代器的枚举器,而我需要许多连接到许多迭代器的枚举器。

1 个答案:

答案 0 :(得分:5)

以下是使用Concurrent.unicast [E]的简单示例:

// assume the following exist:
def readValueAsync(source: MySource): Future[Any]
val source: MySource = ...

// this is where the meat is:
val valueEnumerator = Concurrent.unicast[Any] {
  (channel: Concurrent.Channel[Any]) =>
    readValueAsync(source) onComplete {
      case Success(x: Any) => channel.push(x)
      case Failure(t) => channel.end(t)
    }
}

// you can then collect it using an iteratee
// since my enumerator never really ends, I only take 10 elements here
val result: List[Any] = 
  valueEnumerator through Enumeratee.take(10) run Interatee.getChunks[Any]