假设我有一个使用此方法的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处理保留在中间,然后发出"]"最后。
答案 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("[", ",", "]") )