高级 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 可能对响应执行的任何压缩。