我的示例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/>After sleep<br/>
当我用curl -v
查询这个servlet时,唯一的立即输出是标题和导致(包括)换行符的响应主体
Before sleep<br />
在5秒后打印其余部分。
Before sleep<br/>
After newline<br/>After sleep<br/>
看起来Web容器对响应数据进行行缓冲。但这意味着servlet只能在换行符之前刷新响应数据,这似乎违反了规范。
有谁知道为什么会这样?
(我在Java EE 7 / Servlets 3.1中使用WildFly 8.2。)
答案 0 :(得分:0)
PrintWriter
正在缓冲响应。您必须致电flush()
,或发送换行符。
答案 1 :(得分:0)
在@JonSkeet建议我查看实际流量后,我确定线路缓冲来自curl
。来自servlet的原始HTTP响应立即返回
HTTP/1.1 200 OK
Content-Type: text/html;charset=ISO-8859-1
Transfer-Encoding: chunked
26
Before sleep<br />
After newline<br />
并在5秒后用
完成11
After sleep<br />
0
所以也许curl
等待显示After newline<br />
位,因为它正在从分块传输编码重建响应体。
无论如何,问题解决了。谢谢!
自我注意:使用不解码块的curl
语法
curl -i --raw
现在我完全按照上面的描述获得输出。