高级 I/O 和 Tomcat

目录

简介

重要说明:使用这些功能需要使用 HTTP 连接器。AJP 连接器不支持它们。

异步写入

当使用 HTTP 连接器时,Tomcat 支持使用 sendfile 发送大型静态文件。这些写入,一旦系统负载增加,将以最有效的方式异步执行。与其使用阻塞写入发送大型响应,不如将内容写入静态文件,并使用 sendfile 代码写入。缓存阀可以利用这一点,将响应数据缓存到文件中,而不是存储在内存中。如果请求属性 org.apache.tomcat.sendfile.support 设置为 Boolean.TRUE,则可以使用 sendfile 支持。

任何 servlet 都可以通过设置适当的请求属性来指示 Tomcat 执行 sendfile 调用。还需要正确设置响应的 content length。使用 sendfile 时,最好确保请求或响应都没有被包装,因为响应主体将在稍后由连接器本身发送,因此无法过滤。除了设置 3 个必要的请求属性外,servlet 不应该发送任何响应数据,但它可以使用任何导致修改响应头的方法(如设置 cookie)。

  • org.apache.tomcat.sendfile.filename: 将作为字符串发送的文件的规范文件名
  • org.apache.tomcat.sendfile.start: 开始偏移量,以 Long 表示
  • org.apache.tomcat.sendfile.end: 结束偏移量,以 Long 表示

除了设置这些参数外,还需要设置 content-length 头。Tomcat 不会为你这样做,因为你可能已经将数据写入输出流。

请注意,使用 sendfile 将禁用 Tomcat 可能对响应执行的任何压缩。