首页 > 解决方案 > 让 Twirl 流式传输 Scala 模板渲染输出?

问题描述

使用带有 Java(控制器)和 Twirl 的 Play Framework,我试图通过单个 HTTP GET 请求(使用 scala 模板,这里没什么特别的)向调用者发送一个包含大约 40MB 数据的页面。问题是当我在模板上调用渲染方法时,我的应用程序崩溃并出现 OutOfMemoryError。我 100% 肯定它与页重 VS 可用堆内存有关,我已经通过测试确认了这一点。我认为这与“为了能够正确计算 Content-Length 标头,Play 必须消耗整个响应数据并将其内容加载到内存中”这一事实有关。(https://www.playframework.com/documentation/2.5.x/JavaStream)。Twirl 模板渲染方法似乎将整个页面加载到内存中,无论如何都是一样的。

正如文档中提到的,我已经确认,如果我使用 InputStream 输出我自己的数据,一切都会顺利进行,我可以发送任意多的数据(如果我愿意,可以发送高达千兆字节的数据,它就可以了)只需在我的控制器方法中 返回ok(myInputStream)即可返回客户端。

现在,我想做的是让 Twirl 使用流式传输(为我提供 InputStream 或类似的东西)呈现其模板。我已经搜索了解决方案,阅读文档无济于事。我是不是看错了地方,或者它只是设计不可用和可能的,除了重新考虑我的模板和请求/响应之外,我别无选择?

Java 8,播放框架 2.5。

标签: javaplayframework

解决方案


推荐阅读