我有一个项目托管在Google Appengine上,标准运行时。 我已经定义了一个servlet,它响应具有高达200kb数据的GET请求。问题是servlet在实际写出之前尝试缓冲大量数据。
我试图通过这样做来缓冲上限,
resp.setBufferSize(1024);
但这没有区别。立即记录缓冲区大小,
LOGGER.info("Using buffer of size " + resp.getBufferSize());
告诉我缓冲区大小为1024,但是一旦写入数据,我再次记录缓冲区大小,并且根据写出的数据,它已经增长到非常大的数量。
现在,如果我将输出增加到足够大的数量,我会得到一个异常,同时写出该数据。数据本身不存储在任何地方,它被生成并写入" ServletOutputStream"直接
Error for /sizeTestServlet
java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2271)
at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118)
at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153)
at java.io.OutputStream.write(OutputStream.java:75)
at com.google.apphosting.runtime.jetty.RpcResponseGenerator.addContent(RpcResponseGenerator.java:65)
at org.mortbay.jetty.AbstractGenerator$Output.write(AbstractGenerator.java:644)
at org.mortbay.jetty.AbstractGenerator$Output.write(AbstractGenerator.java:589)
有没有办法禁用输出缓冲?
答案 0 :(得分:1)
App Engine实例不支持数据流 - 它们总是返回整个响应。如果需要流式传输数据,可以使用灵活的环境。
流式响应
App Engine不支持发送数据的流式响应 在处理请求时向客户端添加增量块。 如上所述收集代码中的所有数据并作为a发送 单个HTTP响应。
但请注意,对于如此小的响应,如您的情况(最多200KB),流式传输可能效率明显低于一次性返回所有数据的速度慢。