【发布时间】:2015-01-02 08:41:43
【问题描述】:
我的示例 servlet 打印出一些数据,刷新缓冲区,休眠 5 秒,然后打印出更多数据并完成。
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
response.setContentType("text/html");
PrintWriter writer = response.getWriter();
writer.println("Before sleep<br/>");
writer.print("After newline<br/>");
writer.flush();
response.flushBuffer();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
}
writer.print("After sleep<br/>");
}
我希望响应主体会导致刷新
Before sleep<br/>
After newline<br/>
立即打印,5 秒后打印最后一张。
Before sleep<br/>After newline<br/><strong>After sleep<br/></strong>
但没有
当我使用 curl -v 查询这个 servlet 时,唯一的直接输出是标题和导致(包括)换行符的响应正文
Before sleep<br />
其余部分在 5 秒后打印。
Before sleep<br/><strong>After newline<br/>After sleep<br/></strong>
为什么?
看起来 Web 容器正在对响应数据进行行缓冲。但这意味着 servlet 只能在换行符之前刷新响应数据,这似乎违反了规范。
有人知道为什么会这样吗?
(我将 WildFly 8.2 与 Java EE 7 / Servlets 3.1 一起使用。)
【问题讨论】:
-
只是为了检查,你确定这不是来自
curl的行为吗?使用 Wireshark 查看原始流量可能是值得的,这样您就可以看到实际数据包的发送时间。它可能什么都不是,但它只是一个想法...... -
谢谢@JonSkeet,你已经一针见血了!刚刚检查,客户端 正在 接收单个块中的第一段响应(直到我调用
flush()的位置)。curl根本不显示换行符之后的部分,直到第二个部分在 5 秒后出现。必须是curl如何解码 HTTP 分块传输编码的工件。再次感谢:)
标签: java servlets buffer response