Tomcat, Comet и getOutputStream () уже были вызваны для этого ответа - PullRequest
3 голосов
/ 18 марта 2011

Я использую Tomcat 6.0.32 с разъемом Http11NioProtocol для реализации длительного опроса.

Мой кометный процессор удерживает HttpSevletResponse в очереди, пока событие не будет готово к отправке обратно. Когда он отправляет событие назад, он записывает двоичный поток в апплет, поэтому я использую response.getOutputStream().write() для отправки данных обратно. При записи в поток он синхронизируется.

Когда другая веб-страница во втором фрейме перезагружается (независимый JSP, сгенерированный из SpringController в том же контейнере), иногда я вижу это в журналах, и страница не загружается.

Возможно ли возникновение ошибки параллелизма между ответом, сгенерированным процессором кометы и обычным сервлетом, когда оба запрашиваются одновременно?

Трассировка стека:

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 ]

2 голосов
/ 22 декабря 2011

Как вы можете видеть в трассировке стека, JSP вызывает response.getWriter(), но в сообщении об исключении говорится, что ранее был вызов response.getOutputStream(). Вы не можете вызывать оба метода для одного и того же объекта ответа.

Это проблема, я не знаю, как решить ее в вашем конкретном контексте ..

0 голосов
/ 23 сентября 2011

О возможном параллелизме: я так не думаю. Ваш сервлет с длинным пулом выполняется в другом потоке с собственным 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(......);
%>

Сгенерированный сервлет, по крайней мере, напечатает 3 '\ n' в выводе перед OutputStream os = response.getOutputStream(), так что все готово ..
Чтобы избежать этого, удалите все пробелы между %> и <%, например:

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

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

Настройте свой Tomcat, чтобы сохранить сгенерированный код .
Посмотрите на сгенерированный код для вашего sale.jsp, я уверен, вы поймете, что не так.

Кроме того, будьте осторожны с <%!, вы должны объявлять некоторые переменные и непреднамеренно делиться ими по ВСЕМ запросам на этой JSP, это может привести к такого рода параллелизму ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...