首页 > 解决方案 > 将大型内容写入 servlet 响应失败

问题描述

我有一个简单的 servlet(在 Tomcat8 中运行),可以简写如下:

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    resp.setContentType("text/plain");
    OutputStream out = resp.getOutputStream();
    byte[] b = "some very large content\n".getBytes()
    for (int i=0; i<1000; i++) {
        out.write(b);
    }
}

我正在使用 Apache HTTPClient 来使用它,基本上是这样的:

CloseableHttpResponse response = ...;
HttpEntity entity = response.getEntity();
InputStream is = entity.getContent();

对于小规模的数据,它可以正常工作,但如果数据超过一定大小,客户端不会使用响应。好像什么都没有发送?

需要注意的是,我事先不知道数据的大小,因此无法指定 Content-Length 标头。

发送未知大小的大响应的正确方法是什么?

标签: tomcatservletstomcat8

解决方案


抱歉无法评论!

一个原因可能是读写连接超时。当读/写操作变得冗长时,Tomcat 会关闭连接。(参考)。(主题问题

您可以尝试将连接超时设置为 -1(无超时)并重试,但如果您正在使用 BIO(连接或后端操作),这并不好。


推荐阅读