已经为此响应调用了Tomcat,Comet和getOutputStream()

时间:2011-03-18 15:05:42

标签: java tomcat comet outputstream

我正在使用Tomcat 6.0.32和Http11NioProtocol连接器来实​​现长轮询。

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

当第二帧中的另一个网页重新加载(从同一容器中的SpringController生成的独立JSP)时,我偶尔会在日志中看到这个并且页面无法加载。

当彗星处理器生成的响应和常规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)

2 个答案:

答案 0 :(得分:2)

正如您在堆栈跟踪中看到的那样,JSP调用response.getWriter(),但异常消息显示之前有response.getOutputStream()的调用。您不能在同一个响应对象上调用这两个方法。

这是问题,我不知道如何在你的特定背景下解决它。

答案 1 :(得分:0)

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

您的问题位于JSP中,如下所示:sale_jsp.java:96
响应中已经提交了某些内容,因此您不能使用getOutputStream()

在JSP中它非常容易,这是一个简单的例子:

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

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

生成的Servlet至少会在OutputStream os = response.getOutputStream()之前的输出中打印3'\ n',所以你已经完成了..
要避免这种情况,请删除%><%之间的每个空格,如下所示:

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

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

配置Tomcat to keep the code generated 看看为sale.jsp生成的代码,我相信你会发现什么是错的。

另外,请注意<%!你应该声明一些变量,并在这个JSP上的所有请求上无意中分享它们,这可能导致这种并发......