无法禁用 Google Appengine 的 servlet 响应输出缓冲
Not able to disable servlet response output buffering of Google Appengine
我在 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)
有什么方法可以禁用输出缓冲吗?
App Engine 实例不支持数据流 - 它们总是 return 整个响应。如果需要流式传输数据,可以使用灵活的环境。
来自
如何处理请求:
Streaming Responses
App Engine does not support streaming responses where data is sent in
incremental chunks to the client while a request is being processed.
All data from your code is collected as described above and sent as a
single HTTP response.
但是请注意,对于如此小的响应,如您的情况(最多 200KB),流式传输的效率和速度可能明显低于 return 一次处理所有数据。
我在 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)
有什么方法可以禁用输出缓冲吗?
App Engine 实例不支持数据流 - 它们总是 return 整个响应。如果需要流式传输数据,可以使用灵活的环境。
来自 如何处理请求:
Streaming Responses
App Engine does not support streaming responses where data is sent in incremental chunks to the client while a request is being processed. All data from your code is collected as described above and sent as a single HTTP response.
但是请注意,对于如此小的响应,如您的情况(最多 200KB),流式传输的效率和速度可能明显低于 return 一次处理所有数据。