Play框架,Akka Persistence,PersistenceQuery,无法将Source转换为Action.async的Future Object

时间:2016-12-02 12:09:36

标签: playframework akka cqrs akka-stream akka-persistence

我正在尝试获取持久性事件列表并将其作为响应发送(Action.async)。但我无法将PersistenceQuery结果转换为Future个对象。这是代码

val queries = PersistenceQuery(actorSystem).readJournalFor[CassandraReadJournal](CassandraReadJournal.Identifier)
val source: Source[EventEnvelope, NotUsed] = queries.eventsByPersistenceId("MYID", 0, Long.MaxValue)
val mappedSource: Source[JsValue, NotUsed] = source.mapAsync(1) { e =>
      e.event match {
        case l: String =>
           Future(Json.parse(l))
      }
   }
val finalResult: Future[List[JsValue]] = mappedSource.take(10).runFold(List[JsValue]())((a, b) => {
      println(a)
      a :+ b
    })
finalResult

我能够在runFold内看到打印件,但finalResult永远不会返回。我甚至试过Await,即使等了几分钟,也没有回来。此finalResult显示要将其作为响应发送给Action.async的所有用户活动。 请告诉我们将Source转换为Future对象

的方法是什么

1 个答案:

答案 0 :(得分:1)

首先使用currentEventsByPersistenceId来修复此问题,这将返回所有当前事件。 eventsByPersistenceId take终止了流。但在我的情况下,take函数需要收集10个事件,在我的情况下,我有少于10个事件,因此在累积至少10个事件之前,流不会被终止。所以结果永远不会被归还。