没有换行符的Servlet响应缓冲区没有刷新

时间:2015-01-02 08:41:44

标签: java servlets buffer response

我的示例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。)

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

现在我完全按照上面的描述获得输出。