3

我正在使用带有 Http11NioProtocol 连接器的 Tomcat 6.0.32 来实现长轮询。

我的彗星处理器正在HttpSevletResponse排队等待事件准备好发回。当它发回事件时,它正在将二进制流写入小程序,所以我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)
4

2 回答 2

2

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

这就是问题所在,我不知道如何在您的特定情况下解决它..

于 2011-12-22T14:26:07.590 回答
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 至少会在输出 before 中打印 3 '\n' OutputStream os = response.getOutputStream(),这样就完成了。为避免这种情况,请删除and
之间的所有空格,如下所示:%><%

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

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

配置您的Tomcat 以保留生成的代码
查看为您生成的代码sale.jsp,我相信您会发现问题所在。

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

于 2011-09-22T21:58:58.833 回答