進階 IO 與 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

除了設定這些參數之外,還需要設定內容長度標頭。Tomcat 沒有幫你這麼做,因為你可能已經將資料寫入輸出串流。

請注意,使用 sendfile 會停用 Tomcat 可能在回應上執行的任何壓縮。