2011-03-18 35 views
3

我正在使用Tomcat 6.0.32和Http11NioProtocol連接器來實​​現長輪詢。已經爲此響應調用了Tomcat,Comet和getOutputStream()

我的彗星處理器將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) 
+0

你試過用response.getWriter()來代替嗎?一個拉[這個答案](http://stackoverflow.com/questions/1776142/getoutputstream-has-already-been-called-for-this-response/1776161#1776161) – Andrew 2011-03-18 15:41:22

+0

我需要使用getOutputStream,因爲我正在發送字節到applet,而不是文本 – Adam 2011-03-18 15:58:04

+1

你可能會發布一些你的servlet的代碼? – brent777 2011-03-18 20:59:40

回答

0

關於可能併發:我don'y這麼認爲。 您的長池Servlet在另一個線程中執行,它有自己的HttpRequest和它自己的HttpResponse

您的問題是位於你的JSP所示:sale_jsp.java:96
東西已經COMMITED的響應,所以你不能使用getOutputStream()

而且它非常的JSP很容易,這是一個簡單的例子:

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

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

生成servlet將,至少,打印3「\ n」在OutputStream os = response.getOutputStream()前的輸出,讓你大功告成了..
爲了避免這種情況,刪除%><%之間的每一個空格,如:

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

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

配置您Tomcat to keep the code generated
看看你的sale.jsp生成的代碼,我相信你會發現什麼是錯的。

另外,要小心<%!你應該聲明一些變量,並無意分享他們在這個JSP所有的請求,這可能導致那種併發...

2

正如你可以在堆棧跟蹤看到, JSP調用response.getWriter(),但是異常消息說以前有一個調用response.getOutputStream()。你不能在同一個響應對象上調用兩個方法。

這是問題所在,我不知道如何解決它在你的特定環境下。

相關問題