首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在comet servlet的tomcat6中禁用输出缓冲

在comet servlet的tomcat6中禁用输出缓冲
EN

Stack Overflow用户
提问于 2012-04-27 22:15:38
回答 1查看 797关注 0票数 1

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

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

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

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

但是,在与Tomcat6配置相同的事件中,当我在http://jelastic.com提供的Tomcat6服务器上部署应用程序时,服务器输出缓冲区很大,我必须发送空字节来触发输出编写器刷新(cf.以下代码)

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

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

有谁有解决方案吗?如何禁用comet servlet输出缓冲区。在我看来很明显,默认情况下应该禁用comet servlet的输出缓冲区。听起来很奇怪。

先谢谢你,

J

EN

回答 1

Stack Overflow用户

发布于 2012-11-09 21:44:56

您是否尝试过使用Filters?http://www.oracle.com/technetwork/java/filters-137243.html来编写自定义请求和响应

使用装饰器模式,您可以控制输出。实现这一点的方法是向生成响应的servlet传递一个替换流。替代流阻止servlet在完成时关闭原始响应流。

代码语言:javascript
复制
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方法中,您将获得原始的PrintWritter,并传递包装器

代码语言:javascript
复制
PrintWriter out = response.getWriter();
CharResponseWrapper wrapper = new CharResponseWrapper((HttpServletResponse)response);
chain.doFilter(request, wrapper);

然后,Servlet会将所有输出写入CharrArrayWritter中,这样您就可以在没有缓冲的情况下获得字符串形式的输出

代码语言:javascript
复制
wrapper.toString()

然后,您可以修改、附加..等,然后使用原始响应输出来写入内容。

代码语言:javascript
复制
out.write(wrapper.toString());
out.close();
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10352303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档