我正在使用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)
答案 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上的所有请求上无意中分享它们,这可能导致这种并发......