没有换行符,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

现在我得到的输出与上面描述的完全一样。