Отсутствие запросов об ошибках в журнале локального хоста tomcat, а IOException во время вызова Джексона появляется в журнале приложения. - PullRequest
5 голосов
/ 01 апреля 2012

Какая-то странная ситуация. Во время теста производительности веб-приложения (война) клиент получает 500 примерно на 2% запросов. При поиске в журнале приложений существуют некоторые исключения:

 java.io.IOException: Stream closed
    at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:394)
    at org.apache.catalina.connector.CoyoteReader.read(CoyoteReader.java:110)
    at org.codehaus.jackson.impl.ReaderBasedParserBase.loadMore(ReaderBasedParserBase.java:95)
    at org.codehaus.jackson.impl.ReaderBasedParser._skipWSOrEnd(ReaderBasedParser.java:935)
    at org.codehaus.jackson.impl.ReaderBasedParser.nextToken(ReaderBasedParser.java:245)
    at org.codehaus.jackson.map.ObjectMapper._initForReading(ObjectMapper.java:2432)
    at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2389)
    at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1618)
    at MyServlet.doPost(MyServlet.java:25)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at MyFilter.doFilter(MyFilter.java:67)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at MyFilter.doFilter(MyFilter.java:28)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:964)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:304)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)

Однако localhost_access пуст и все запросы там имеют 200 кодов состояния.

Буду признателен за понимание этой проблемы:

  • Как может случиться, что в журнале localhost_access пропущено 500 запросов, пока клиент их получает. Когда это вообще произойдет?
  • Почему java.io.IOException генерируется только изредка (менее 2% запросов)?

Обновление 1: Проблема возникает с Tomcat 7.0.22 и Java 6

Обновление 2: Вот пример запроса к статическому html-файлу (даже к сервлету, поэтому в журнале нет исключений и ничего в localhost_access):

Response headers:
HTTP/1.1 500 Internal Server Error
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=utf-8
Transfer-Encoding: chunked
Date: Mon, 02 Apr 2012 07:35:06 GMT
Connection: close

Обновление 3: для устранения сети Я провел те же тесты на локальном хосте. Это не повлияло на результаты теста. Так что это не сеть.

Обновление 4: Перезапуск Tomcat помог. И все же я не понимаю, что вызвало первоначальную проблему.

Обновление 5: Tomcat обновлен до 7.0.26, но это не решило проблему.

Обновление 6: Переехал на причал. Ошибки ушли. Должен ли я сказать "До свидания" Tomcat после всех этих лет?

Ответы [ 3 ]

5 голосов
/ 01 апреля 2012

Вы не говорите, какую версию Tomcat вы используете, что было бы большой помощью. Мое предположение, основанное на том, что вы видите, заключается в том, что он относительно старый.
Журнал доступа реализован как Valve. Если запрос отклонен до того, как он достигнет Valves, он никогда не появится в журнале доступа. Обычно это происходит, когда запрос искажен, но есть другие обстоятельства, которые могут вызвать его.
Начиная с Tomcat 6.0.30 (и всех версий 7.0.x) механизм ведения журнала доступа был реорганизован для обеспечения записи сообщений в журнал доступа, даже если запрос отклонен до того, как он достигает AccessLogValve.

IOException генерируется, когда клиент закрывает соединение. Является ли это из-за 500 или вызывает 500 неясно из предоставленной информации.

4 голосов
/ 01 апреля 2012

Сообщение об ошибке указывает на то, что IOException появляется правильно, когда Джексон пытается инициализировать синтаксический анализ, что означает, что базовое HTTP-соединение уже закрыто, когда начинается анализ запроса. Итак, что-то закрыло связь; и хотя это может быть как клиент, так и сервер (HTTP позволяет обоим концам закрывать соединения в любой точке), часто это что-то посередине (брандмауэр, прокси, loadbalancer); часто из-за какого-то тайм-аута.

1 голос
/ 17 июля 2013

AJAX Post на IE имеет проблемы с перебоями. Мы видели сокет время и исключения. Вы можете отключить KeepAlive и попробовать или отключить KeepAlive для AJAX POST, используя заголовок «connection: close». Настройте apache requestreadtime для запроса без тела.

...