使用Jetty AsyncProxyServlet流式传输HTTP响应

时间:2016-11-13 08:09:01

标签: java jetty

我有一台服务器可以通过长期的HTTP响应来传输各种内容,例如日志输出。但是,当使用Jetty的代理servlet时,我无法让它传输响应(它在发送之前缓冲整个响应)。

使用覆盖普通ProxyServlet类,以下似乎可行:

@Override
protected void onResponseContent(HttpServletRequest request, HttpServletResponse response, Response proxyResponse, byte[] buffer, int offset, int length, Callback callback) {
    super.onResponseContent(request, response, proxyResponse, buffer, offset, length, callback);
    try {
        response.getOutputStream().flush();
    } catch (IOException e) {
        log.warn("Error flushing", e);
    }
}

但是,覆盖AsyncProxyServlet时这样做是行不通的。 (完整源代码here。)

所以,有两个问题:

  1. 使用ProxyServlet时,在收到的每一段内容之后是否正在刷新?
  2. 有没有办法让它适用于AsyncProxyServlet

1 个答案:

答案 0 :(得分:1)

搞定了。无论是否使用异步,正确的方法都有效,即在创建Jetty服务器连接器时设置输出缓冲区大小。

HttpConfiguration httpConfig = new HttpConfiguration();
httpConfig.setOutputBufferSize(1024);
ServerConnector httpConnector = new ServerConnector(jettyServer,
        new HttpConnectionFactory(httpConfig));

默认值为32768。

(注意:无需覆盖onResponseContent方法)