1

出力バッファリングの動作と応答中に使用されるチャンクの数は、応答が通常のサーブレットからのものか、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のチャンクが表示されるはずです(この動作は通常のサーブレットの場合に発生します)

4

0 に答える 0