为什么普通servlet和Jersey servlet的输出缓冲行为不同?

时间:2012-11-03 00:35:31

标签: java servlets jetty jersey embedded-jetty

输出缓冲行为和响应更改期间使用的块数 取决于响应是来自普通的servlet还是来自Jersey容器servlet的资源。

我正在使用虚拟servlet和虚拟Jersey资源进行测试。 两者都打印256个字符的倍数(255'a'和1'\ n',这些不重要,只是随机选择)。

Jetty的默认输出缓冲区为32kB,当输出内容超过该大小时,如果未明确设置Content-Length,Jetty将使用分块传输编码。

但是,当从Jersey资源完成相同的测试时,无论输出大小如何,Jetty总是使用分块传输编码,并且块分为16kB而不是32kB。

我浏览了两者的来源,但找不到原因。如果有人能分享他们对此的见解,我真的很高兴。

Servlet测试代码

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();
}   
}

设置

  • Embedded Jersey 8.1.7.v20120910
  • Jersey 1.14(使用Jersey Servlet容器)

count = 1的响应(即输出大小为256字节)

  • Servlet:Content-Length set
  • Jersey:Content-Length未设置,使用分块编码,1 chunk

计数响应= 128(即输出大小32kB)

  • Servlet:未设置Content-Length,使用分块编码,1 chunk
  • 泽西岛:内容长度未设置,使用分块编码,2个块(以16kB分割)

计数的响应= 256(即输出大小为64kB)

  • Servlet:未设置Content-Length,使用分块编码,2个块
  • Jersey:Content-Length未设置,使用分块编码,4块

任何人都有任何关于这种差异的想法吗?

更新1: Jersey设置内部缓冲区大小为8kB,但这仍然无法解释我所看到的16kB行为。如果Jersey每8kB刷新一次,那么我应该看到8kB的块不是16kB(这种行为存在于普通的servlet情况下)

0 个答案:

没有答案
相关问题