在Play 2.5中预先/后缀源流

时间:2017-07-04 10:43:15

标签: json scala playframework streaming akka

假设我有一个使用此方法的Play控制器 -

def persons(): Action[AnyContent] =
  Action { _ =>
    Ok.chunked(personSource.map { p => JsObject(p) }
  )
}

Akka Source流是一个庞大但有限的人流,比如我们的数据库。一次将所有内容加载到内存中会导致内存不足异常。

上面的代码工作正常,我得到了很长的json对象:

{"name": "TestPerson1}{"name": "TestPerson2"}

但是现在客户已经请求响应具有以下格式:

[{"name": "TestPerson1},{"name": "TestPerson2"}]

我在查找如何向流中发出前缀/后缀时遇到了麻烦。可能是过滤器,还是嵌套动作?但是我发现的示例往往会在请求上运行,例如重定向,或者在将处理交给内部Action之前进行副作用操作,例如记录某些内容。

我想发出" ["在http响应开始时,将Source async chunked处理保留在中间,然后发出"]"最后。

1 个答案:

答案 0 :(得分:1)

感谢@cchantep

找到解决方案
val persons = source.map { p => JsObject(p).toString }.intersperse(",")
Action { _ =>
  Ok.chunked(Source(List("[")).concat(persons).concat(Source(List("]"))))
}

甚至更简单(感谢this页面,我之前没有找到过):

Ok.chunked(source.map { p => JsObject(p).toString }.intersperse("[", ",", "]") )