2013-04-03 7 views
13

В настоящее время мы переносим устаревшее приложение на Jetty. И у меня есть какое-то исключение в отношении сломанной трубы.java.io.IOException: Broken pipe

  • Java 6
  • Jetty 8.1.8
  • Spring 3.2.0

Я пытаюсь перенести Glassfish веб-приложение на Jetty. В нашей тестовой среде мы используем балансировщик нагрузки, и все работает нормально. Наши клиенты работают без проблем.

WARN [2013-04-03 13:34:28,963] com.myapp.bbb.config.MvcDefaultConfig$1: Handler execution resulted in exception 
! org.eclipse.jetty.io.EofException: null 
! at org.eclipse.jetty.http.HttpGenerator.flushBuffer(HttpGenerator.java:914) 
! at org.eclipse.jetty.http.HttpGenerator.complete(HttpGenerator.java:798) 
! at org.eclipse.jetty.server.AbstractHttpConnection.completeResponse(AbstractHttpConnection.java:642) 
! at org.eclipse.jetty.server.Response.complete(Response.java:1234) 
! at org.eclipse.jetty.server.Response.sendError(Response.java:404) 
! at org.eclipse.jetty.server.Response.sendError(Response.java:416) 
! at org.springframework.web.servlet.DispatcherServlet.noHandlerFound(DispatcherServlet.java:1111) 
! at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:898) 
! at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) 
! at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:915) 
! at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:811) 
! at javax.servlet.http.HttpServlet.service(HttpServlet.java:735) 
! at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:796) 
! at javax.servlet.http.HttpServlet.service(HttpServlet.java:848) 
! at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:669) 
! at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1336) 
! at com.magnetdigital.maggy.dropwizard.head2get.Head2GetFilter.doFilter(Head2GetFilter.java:22) 
! at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1307) 
! at com.yammer.dropwizard.servlets.ThreadNameFilter.doFilter(ThreadNameFilter.java:29) 
! at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1307) 
! at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:453) 
! at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:229) 
! at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1072) 
! at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:382) 
! at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193) 
! at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1006) 
! at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135) 
! at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116) 
! at com.yammer.metrics.jetty.InstrumentedHandler.handle(InstrumentedHandler.java:200) 
! at org.eclipse.jetty.server.handler.GzipHandler.handle(GzipHandler.java:275) 
! at com.yammer.dropwizard.jetty.BiDiGzipHandler.handle(BiDiGzipHandler.java:123) 
! at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154) 
! at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116) 
! at org.eclipse.jetty.server.Server.handle(Server.java:365) 
! at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:485) 
! at org.eclipse.jetty.server.BlockingHttpConnection.handleRequest(BlockingHttpConnection.java:53) 
! at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:926) 
! at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:988) 
! at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:635) 
! at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235) 
! at org.eclipse.jetty.server.BlockingHttpConnection.handle(BlockingHttpConnection.java:72) 
! at org.eclipse.jetty.server.nio.BlockingChannelConnector$BlockingChannelEndPoint.run(BlockingChannelConnector.java:298) 
! at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608) 
! at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543) 
! at java.lang.Thread.run(Thread.java:662) 
Caused by: ! java.io.IOException: Broken pipe 
! at sun.nio.ch.FileDispatcher.write0(Native Method) 
! at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:29) 
! at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:69) 
! at sun.nio.ch.IOUtil.write(IOUtil.java:26) 
! at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:334) 
! at org.eclipse.jetty.io.nio.ChannelEndPoint.flush(ChannelEndPoint.java:293) 
! at org.eclipse.jetty.server.nio.BlockingChannelConnector$BlockingChannelEndPoint.flush(BlockingChannelConnector.java:253) 
! at org.eclipse.jetty.http.HttpGenerator.flushBuffer(HttpGenerator.java:850) 
!... 44 common frames omitted 

Когда я проверяю стек, я видел, что это исключение вызвано всегда запросом 404.

org.springframework.web.servlet.DispatcherServlet.noHandlerFound (DispatcherServlet.java:1111)

  • Почему у меня возникают это исключение?
  • Как я могу воспроизвести это исключение на своей машине локально?
+0

в моем случае это happended когда я устанавливаю всплывающее окно для загрузки из моего бэкэнда с тайм-аутом для автоматического закрытия, и он закрывается перед загрузкой всплывающего окна. – shareef

ответ

16

Самая распространенная причина, по которой я столкнулся с «сломанной трубой», заключается в том, что одна машина (пары, подключаемой через сокет) закрыла конец разъема до завершения связи. Около половины из них были связаны с тем, что программа, сообщающая об этом сокете, прекратилась.

Если программа, отправляющая байты, отправляет их и немедленно выключает сокет или завершает себя, возможно, что сокет перестает функционировать до того, как байты будут переданы и прочитаны.

Попробуйте помещать паузы в любом месте, где вы закрываете сокет, и перед тем, как разрешить программе завершить работу, чтобы узнать, помогает ли это.

FYI: «pipe» и «socket» - это термины, которые иногда используются как взаимозаменяемые.

+0

Я почти знаю запрос, который создает это исключение, но я не смог бы создать подобный. У вас есть идея создать сломанную трубу с помощью завитки или что-то еще? – Cemo

+0

Если вы считаете, что знаете запрос, создающий исключение, почему вы не можете попробовать то, что я предложил, вместо того, чтобы пытаться создать код, который дает вам еще один? – arcy

+4

rcook - это правильно, похоже, что клиент не беспокоился полностью из-за ответа до выхода ... вы часто можете получить это, когда пользователь переходит от страницы до того, как он полностью загрузится. –

-1

увеличить response.getBufferSize() получить размер буфера и сравнить с байтами, которые вы хотите перенести!

+2

Это не дает ответа на вопрос. Чтобы критиковать или запросить разъяснения у автора, оставьте комментарий ниже своего сообщения - вы всегда можете прокомментировать свои собственные сообщения, и как только у вас будет достаточно [репутации] (http://stackoverflow.com/help/whats-reputation), вы будете быть в состоянии [прокомментировать любое сообщение] (http://stackoverflow.com/help/privileges/comment). –

+0

Здравствуйте, я практикую это, и это единственный ответ на этот вопрос. Получает ли ответ от arcy какие-либо ценные данные для вас? Знаете ли вы, что нужно изменить его? –

+0

В JDK нет метода 'bufferSize()', или любое из вариантов написания и «сравнить [размер буфера] с байтами, которые вы хотите передать», не имеет смысла. Ответ - глупость. – EJP

3

Я согласен с @arcy, проблема на стороне клиента, на моем случае это было из-за nginx, позвольте мне уточнить Я использую nginx в качестве интерфейса (чтобы я мог распространять нагрузку, ssl и т. Д.)) и используя proxy_pass http://127.0.0.1:8080 для перенаправления соответствующих запросов на tomcat.

Существует значение по умолчанию для переменной Nginx proxy_read_timeout 60-х годов, что должно быть достаточно, но в некоторых пиковые моменты моя установка будет ошибка с java.io.IOException: Broken трубы меняющегося значение не поможет, пока корень причина (60 секунд должно быть достаточно) может быть исправлена.

ПРИМЕЧАНИЕ: Я сделал новый ответ, так что я мог бы расширить немного больше моем случае (это было единственное упоминание я нашел об этой ошибке в Интернете после просмотра довольно много)

Смежные вопросы