wake-up-neo.com

java.io.IOException: Defekte Pipe

Wir migrieren derzeit eine ältere Anwendung zu Jetty. Und ich habe irgendwie eine Ausnahme in Bezug auf eine gebrochene Pfeife.

  • Java 6
  • Jetty 8.1.8
  • Frühling 3.2.0

Ich versuche, eine Glassfish-Webanwendung nach Jetty zu migrieren. In unserer Testumgebung verwenden wir einen Load Balancer und alles funktioniert gut. Unsere Kunden arbeiten problemlos. 

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

Wenn ich den Stacktrace überprüfe, habe ich gesehen, dass diese Ausnahmen immer durch eine 404-Anfrage ausgelöst werden. 

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

  • Warum habe ich diese Ausnahme? 
  • Wie kann ich diese Ausnahme auf meinem Computer lokal reproduzieren? 
17
Cemo

Der häufigste Grund, den ich für eine "kaputte Pfeife" hatte, ist der, dass eine Maschine (eines über Socket kommunizierenden Paares) das Ende des Socket heruntergefahren hat, bevor die Kommunikation abgeschlossen war. Etwa die Hälfte davon war darauf zurückzuführen, dass das Programm, das auf diesem Sockel kommuniziert, beendet wurde. 

Wenn das Programm, das Bytes sendet, sie aussendet und den Socket sofort herunterfährt oder sich selbst beendet, ist es möglich, dass der Socket nicht mehr funktioniert, bevor die Bytes übertragen und gelesen wurden. 

Versuchen Sie, Pausen an einer beliebigen Stelle zu setzen, an der Sie den Socket herunterfahren, und bevor Sie zulassen, dass das Programm beendet wird, um zu sehen, ob dies hilfreich ist.

Zu Ihrer Information: "Pipe" und "Muffe" sind Begriffe, die manchmal austauschbar verwendet werden.

24
arcy

Ich stimme mit @arcy überein, das Problem liegt auf der Clientseite, in meinem Fall lag es an Nginx. Lassen Sie mich das näher erläutern Ich benutze Nginx als Frontend (so kann ich load, ssl, etc ...) und Verwenden Sie proxy_pass http://127.0.0.1:8080, um die entsprechenden Anforderungen an Tomcat weiterzuleiten.

Es gibt einen Standardwert für die Nginx-Variable proxy_read_timeout von 60s, der ausreichen sollte, aber in einigen Momenten würde mein Setup mit der Java.io.IOException einen Fehler verursachen: Defekte Pipe Das Ändern des Werts hilft, bis die Ursache ( 60s sollte reichen) kann behoben werden.

HINWEIS: Ich habe eine neue Antwort gefunden, sodass ich mit meinem Fall ein wenig mehr erweitern konnte (es war die einzige Erwähnung, die ich über diesen Fehler im Internet gefunden habe, nachdem ich viel gesucht hatte)

5
user322049

Grundsätzlich ist es so, dass Ihr Benutzer entweder die Browser-Registerkarte schließt oder zu einer anderen Seite navigiert, bevor die Kommunikation abgeschlossen ist. Ihr Webserver (Jetty) generiert diese Ausnahme, da die verbleibenden Bytes nicht gesendet werden können. 

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)
! 

Dies ist kein Fehler auf Ihrer Anwendungslogikseite. Dies ist einfach auf das Benutzerverhalten zurückzuführen. In Ihrem Code ist an sich nichts falsch.

Es gibt zwei Dinge, die Sie möglicherweise tun können:

  1. Ignorieren Sie diese bestimmte Ausnahme, damit Sie sie nicht protokollieren.
  2. Machen Sie Ihren Code effizienter/komprimierter, damit er weniger Daten überträgt. (Nicht immer eine Option!)
2
Amrinder Arora

erhöhen Sie die response.getBufferSize () Holen Sie sich die Puffergröße und vergleichen Sie sie mit den Bytes, die Sie übertragen möchten!