我正在使用 Tomcat 6.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)
最佳答案
正如您在堆栈跟踪中看到的那样,JSP 调用了 response.getWriter()
,但异常消息表明调用了 response.getOutputStream()
前。您不能在同一个响应对象上调用这两种方法。
这就是问题所在,我不知道如何在您的特定上下文中解决它..
关于java - 已为此响应调用 Tomcat、Comet 和 getOutputStream(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5353866/