高级 I/O 与 Tomcat

目录

简介

重要提示:使用这些功能需要使用 HTTP 连接器。AJP 连接器不支持这些功能。

异步写入

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

任何 Servlet 都可以通过设置适当的请求属性来指示 Tomcat 执行 sendfile 调用。还需要正确设置响应的内容长度。使用 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 可能对响应执行的任何压缩。