Java 已为此响应调用Tomcat、Comet和getOutputStream()

Java 已为此响应调用Tomcat、Comet和getOutputStream(),java,tomcat,comet,outputstream,Java,Tomcat,Comet,Outputstream,我使用Tomcat6.0.32和Http11NioProtocol连接器来实现长轮询 我的comet处理器正在队列中保留HttpSevletResponse,直到事件准备好发回。当它发回事件时,它正在向小程序写入二进制流,因此我使用response.getOutputStream().write()将数据发回。当写入流时,它是同步的 当第二个框架中的另一个网页重新加载时(由同一容器中的SpringController生成的独立JSP),我偶尔会在日志中看到这一点,而该页面无法加载 当comet处

我使用Tomcat6.0.32和Http11NioProtocol连接器来实现长轮询

我的comet处理器正在队列中保留
HttpSevletResponse
,直到事件准备好发回。当它发回事件时,它正在向小程序写入二进制流,因此我使用
response.getOutputStream().write()
将数据发回。当写入流时,它是同步的

当第二个框架中的另一个网页重新加载时(由同一容器中的SpringController生成的独立JSP),我偶尔会在日志中看到这一点,而该页面无法加载

当comet处理器和常规servlet同时被请求时,它们生成的响应之间是否可能存在并发错误

堆栈跟踪:

java.lang.IllegalStateException: getOutputStream() has already been called for this response
at org.apache.catalina.connector.Response.getWriter(Response.java:611)
at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:198)
at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:112)
at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:112)
at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:112)
at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125)
at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118)
at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:180)
at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:118)
at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:77)
at org.apache.jsp.WEB_002dINF.jsp.sale_jsp._jspService(sale_jsp.java:96)

关于可能的并发:我不这么认为。 您的长池Servlet在另一个线程中执行,它有自己的
HttpRequest
和自己的
HttpResponse

您的问题位于JSP中,如图所示:
sale\u JSP.java:96

响应中已经提交了某些内容,因此不允许使用
getOutputStream()

在JSP中,非常简单,这是一个简单的示例:

<%@ page language="java" contentType="text/html;" %>
<%@ page import="java.io.*" %>

<% OutputStream os = response.getOutputStream(); 
   os.write(......);
%>
配置您的应用程序。
请查看为您的
sale.jsp
生成的代码,我相信您会发现问题所在。


另外,要小心
,正如您在堆栈跟踪中看到的,JSP调用了
response.getWriter()
,但是异常消息说之前调用了
response.getOutputStream()
。不能在同一响应对象上同时调用这两个方法


这就是问题所在,我不知道如何在您特定的上下文中解决它。

您是否尝试过使用response.getWriter()来代替?我需要使用getOutputStream,因为我正在向小程序发送字节,而不是文本。您可以发布一些servlet的代码吗?
<%@ page language="java" contentType="text/html;"
    import="java.io.*"   %><%

    OutputStream os = response.getOutputStream(); 
   os.write(......);
%>