没有换行符,Servlet 响应缓冲区不会刷新
Servlet response buffer not flushing without newlines
我的示例 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/>");
}
我希望响应 body 导致同花顺
Before sleep<br/>
After newline<br/>
立即打印,5秒后,最后一张。
Before sleep<br/>
换行后<br/><strong>睡眠后<br/></strong>
但是没有
当我使用 curl -v
查询此 servlet 时,唯一的直接输出是 headers 和导致(并包括)换行符
的响应 body
Before sleep<br />
其余部分在 5 秒后打印。
Before sleep<br/>
<strong>换行后<br/>休眠后<br/></strong>
为什么?
Web 容器似乎是 line-buffering 响应数据。但这意味着 servlet 只能刷新换行符之前的响应数据,这似乎违反了规范。
有人知道为什么会这样吗?
(我将 WildFly 8.2 与 Java EE 7 / Servlets 3.1 一起使用。)
PrintWriter
正在缓冲响应。您必须致电 flush()
,或发送换行符。
@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
现在我得到的输出与上面描述的完全一样。
我的示例 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/>");
}
我希望响应 body 导致同花顺
Before sleep<br/>
After newline<br/>
立即打印,5秒后,最后一张。
Before sleep<br/>
换行后<br/><strong>睡眠后<br/></strong>
但是没有
当我使用 curl -v
查询此 servlet 时,唯一的直接输出是 headers 和导致(并包括)换行符
Before sleep<br />
其余部分在 5 秒后打印。
Before sleep<br/>
<strong>换行后<br/>休眠后<br/></strong>
为什么?
Web 容器似乎是 line-buffering 响应数据。但这意味着 servlet 只能刷新换行符之前的响应数据,这似乎违反了规范。
有人知道为什么会这样吗?
(我将 WildFly 8.2 与 Java EE 7 / Servlets 3.1 一起使用。)
PrintWriter
正在缓冲响应。您必须致电 flush()
,或发送换行符。
@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
现在我得到的输出与上面描述的完全一样。