出力バッファリングの動作と応答中に使用されるチャンクの数は、応答が通常のサーブレットからのものか、Jerseyコンテナサーブレットのリソースからのものかによって異なります。
テストには、ダミーのサーブレットとダミーのサーブレットリソースを使用しています。どちらも256文字の倍数を印刷しています(255'a'および1'\ n'、これらは重要ではなく、ランダムな選択です)。
Jettyのデフォルトの出力バッファは32kBで、出力コンテンツがそのサイズを超えると、Content-Lengthが明示的に設定されていない場合、Jettyはチャンク転送エンコーディングを使用します。
ただし、出力サイズに関係なく、Jerseyリソースから同じテストが実行される場合、Jettyは常にチャンク転送エンコーディングを使用し、チャンクは32kBではなく16kBで分割されます。
両方のソースをナビゲートしましたが、理由が見つかりませんでした。誰かがこれについての洞察を共有できれば本当に嬉しいです。
サーブレットテストコード
public class Test extends HttpServlet {
private static final long serialVersionUID = 1L;
private String baseString;
public Test() {
super();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 255 ; i++)
sb.append("a");
sb.append("\n");
baseString = sb.toString();
}
private void writeOutput(int count, PrintWriter writer) {
for (int i = 0; i<count; i++) {
writer.print(baseString);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
writeOutput(Integer.parseInt(request.getParameter("count")),response.getWriter());
}
}
ジャージーリソーステストコード
@Path("/")
public class JerseyTest {
private String baseString;
public JerseyTest() {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 255 ; i++)
sb.append("a");
sb.append("\n");
baseString = sb.toString();
}
@GET
@Produces("text/html;charset=UTF-8")
public String get(@Context HttpServletResponse response,@QueryParam("count")int count) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i<count; i++) {
sb.append(baseString);
}
return sb.toString();
}
}
設定
- エンベデッドジャージー8.1.7.v20120910
- ジャージー1.14(ジャージーサーブレットコンテナを使用)
count = 1の応答(つまり、出力サイズ256バイト)
- サーブレット:Content-Lengthセット
- ジャージー:Content-Lengthが設定されていません、チャンクエンコーディングが使用されています、1チャンク
count = 128の応答(つまり、出力サイズ32kB)
- サーブレット:Content-Lengthが設定されていません、チャンクエンコーディングが使用されています、1チャンク
- ジャージー:Content-Lengthが設定されておらず、チャンクエンコーディングが使用されています。2チャンク(16kBで分割)
count = 256の応答(つまり、出力サイズ64kB)
- サーブレット:Content-Lengthが設定されていません、チャンクエンコーディングが使用されています、2チャンク
- ジャージー:Content-Lengthが設定されていません、チャンクエンコーディングが使用されています、4チャンク
この違いの理由について誰かが何か考えを持っていますか?
更新1:ジャージーは8kBの内部バッファーサイズを設定しますが、これは私が見ている16kBの動作をまだ説明していません。ジャージーが8kBごとにフラッシュしている場合、16kBではなく8kBのチャンクが表示されるはずです(この動作は通常のサーブレットの場合に発生します)