Jetty / HttpServletResponse中的慢动态资源传输

时间:2015-08-13 11:36:12

标签: java servlets jetty

我们有一个环境,每个用户可能会获得不同的html / js / css资源。我正在使用以下代码来压缩和传输java脚本资源:

public static byte[] compress(String str) throws IOException {
        if (str == null || str.length() == 0) {
            return null;
        }
        ByteArrayOutputStream obj=new ByteArrayOutputStream();
        GZIPOutputStream gzip = new GZIPOutputStream(obj);
        gzip.write(str.getBytes("UTF-8"));
        gzip.close();
        return obj.toByteArray();
}

...
HttpServletResponse raw = response.raw();
raw.setBufferSize(file.length().intValue());
ServletOutputStream servletOutputStream = raw.getOutputStream();
servletOutputStream.write(compress(FileUtils.readFileToString(file)));
servletOutputStream.flush();
servletOutputStream.close();
...

使用chrome网络选项卡检查问题,300KB压缩数据的下载时间为2秒 - 这似乎不合理。 问题不在于带宽或码头本身,因为静态资源传输时间很快。

1 个答案:

答案 0 :(得分:0)

不知道这是否是你瓶颈的根源,但我不会这样做:

 raw.setBufferSize(file.length().intValue());

如果gzip压缩文件大约为300KB,那么您可以创建大于此值的响应缓冲区。当您传输静态内容时,您根本不需要大的响应缓冲区。

来自servlet javadoc:

  

设置响应正文的首选缓冲区大小。该   servlet容器将使用至少与大小一样大的缓冲区   请求。使用的实际缓冲区大小可以找到   getBufferSize。

     

更大的缓冲区允许在任何内容之前写入更多内容   实际发送,从而为servlet提供更多的设置时间   适当的状态代码和标题。较小的缓冲区减少   服务器内存加载并允许客户端开始更多地接收数据   快。