高度なIOとTomcat

目次

はじめに

重要事項: これらの機能を使用するには、HTTPコネクターを使用する必要があります。AJPコネクターはこれらの機能をサポートしていません。

非同期書き込み

HTTPコネクターを使用する場合、Tomcatは大きな静的ファイルを送信するためにsendfileの使用をサポートしています。システム負荷が増加するとすぐに、これらの書き込みは最も効率的な方法で非同期に実行されます。ブロッキング書き込みを使用して大きな応答を送信する代わりに、コンテンツを静的ファイルに書き込み、sendfileコードを使用して書き込むことが可能です。キャッシュバルブは、応答データをメモリに保存する代わりにファイルにキャッシュするために、この機能を利用できます。sendfileサポートは、リクエスト属性org.apache.tomcat.sendfile.supportBoolean.TRUEに設定されている場合に利用可能です。

任意のサーブレットは、適切なリクエスト属性を設定することで、Tomcatにsendfile呼び出しを実行するよう指示できます。また、応答のコンテンツ長を正しく設定する必要もあります。sendfileを使用する場合、応答本体はコネクター自体によって後で送信されるため、フィルター処理できないため、リクエストまたは応答のいずれもラップされていないことを確認するのが最善です。必要な3つのリクエスト属性を設定する以外に、サーブレットは応答データを送信すべきではありませんが、応答ヘッダーを変更する(クッキーの設定など)結果となるメソッドを使用することは可能です。

  • org.apache.tomcat.sendfile.filename: Stringとして送信されるファイルの正規ファイル名
  • org.apache.tomcat.sendfile.start: Longとしての開始オフセット
  • org.apache.tomcat.sendfile.end: Longとしての終了オフセット

これらのパラメータを設定することに加えて、Content-Lengthヘッダーを設定する必要があります。すでに出力ストリームにデータを書き込んでいる可能性があるため、Tomcatがそれを行うことはありません。

sendfileを使用すると、Tomcatが応答に対して実行していた可能性のある圧縮が無効になることに注意してください。