Servlets 在Tomcat6中为comet servlet禁用输出缓冲

Servlets 在Tomcat6中为comet servlet禁用输出缓冲,servlets,buffer,tomcat6,comet,Servlets,Buffer,Tomcat6,Comet,我使用comet和Tomcat6将数据推送到客户端 我希望在连接关闭之前接收数据(XMLHttpRequest的就绪状态=3),问题是Tomcat6在发送数据之前会缓冲数据,所以我需要做一些棘手的事情来实现这一点 我已经将请求内容类型设置为application/x-javascript,将req内容类型设置为application/xml(以便禁用浏览器缓存) 我在tomcat 6中使用了许多可用选项来禁用缓存(nio连接器中的socketBuffer=-1,等等),这在我的本地tomcat

我使用comet和Tomcat6将数据推送到客户端

我希望在连接关闭之前接收数据(XMLHttpRequest的就绪状态=3),问题是Tomcat6在发送数据之前会缓冲数据,所以我需要做一些棘手的事情来实现这一点

我已经将请求内容类型设置为application/x-javascript,将req内容类型设置为application/xml(以便禁用浏览器缓存)

我在tomcat 6中使用了许多可用选项来禁用缓存(nio连接器中的socketBuffer=-1,等等),这在我的本地tomcat 6(在windows操作系统上)中有效(实际上,即使没有修改任何默认选项)

但是,对于配置相同的tomcat 6的事件,当我在提供的tomcat 6服务器上部署应用程序时,服务器输出缓冲区很大,我必须发送空字节以触发输出写入程序刷新(参见下面的代码)

byte[]bytes=新字节[event.getHttpServletResponse().getBufferSize()-new Gson().toJson(messagesContent.getBytes().length]; event.getHttpServletResponse(); event.getHttpServletResponse().getOutputStream().write(字节); event.getHttpServletResponse().getOutputStream().flush()

如果我不在数据内容之外写入字节,则数据不会发送到客户端。这真的很烦人,因为我发送无用的空字节,而且因为我必须在客户端管理这些空字节。太可怕了

有人有解决办法吗?如何禁用comet servlet输出缓冲区。对于我来说,默认情况下应该为comet servlet禁用输出缓冲区是非常明显的。听起来很奇怪

提前谢谢你


你试过使用过滤器吗? 在定制请求和响应的编程中

使用decorator模式可以控制输出。 实现这一点的方法是将生成响应的servlet传递给代理流。代理流防止servlet在完成时关闭原始响应流

class CharResponseWrapper extends HttpServletResponseWrapper {
    private CharArrayWriter output;
    public String toString() {
      return output.toString();
    }
    public ResponseWrapper(HttpServletResponse response) {
        super(response); 
        output = new CharArrayWriter();
    }
    public PrintWriter getWriter(){
        return new PrintWriter(output);
    }

}
因此,在过滤器的doFilter方法中,您将获得原始的PrintWriter,并传递包装器

PrintWriter out = response.getWriter();
CharResponseWrapper wrapper = new CharResponseWrapper((HttpServletResponse)response);
chain.doFilter(request, wrapper);
然后Servlet将在charrayraywriter中写入所有输出,这样您就可以在没有缓冲的情况下以字符串的形式获得输出

wrapper.toString()
然后您可以修改、追加。。etc,然后使用原始响应输出写入内容

out.write(wrapper.toString());
out.close();