java.io.IOException: Broken pipe
Nous sommes actuellement à la migration d'une application héritée de la Jetée. Et j'ai en quelque sorte une exception concernant un bris de tuyau.
- Java 6
- Jetée 8.1.8
- Printemps 3.2.0
Je suis en train de migrer un Glassfish web de l'application de la Jetée. Dans notre environnement de test, nous utilisons un programme d'équilibrage de charge et tout fonctionne bien. Nos clients sont de travail sans aucun problème.
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
Lorsque je vérifie la stacktrace j'ai vu ce sont des exceptions déclenchées par toujours une erreur 404 demande.
org.springframework.web.servlet.DispatcherServlet.noHandlerFound(DispatcherServlet.java:1111)
- Pourquoi suis-je avoir cette exception?
- Comment puis-je reproduire cette exception à ma machine en local?
dans mon cas, c'lancée lorsque j'ai mis en popup à charger à partir de mon arrière-plan avec le temps de fermeture automatique, et elle se ferme avant le chargement de la popup
OriginalL'auteur Cemo | 2013-04-03
Vous devez vous connecter pour publier un commentaire.
La raison la plus commune que j'ai eu pour un "broken pipe" n'est qu'une machine (d'une paire de la communication par socket) a fermé ses fin de la prise avant que la communication est terminée. Environ la moitié de ceux qui ont été parce que le programme de communication sur ce socket a pris fin.
Si le programme de l'envoi d'octets envoie et arrête immédiatement le support ou se termine, il est possible pour le socket pour cesser de fonctionner avant les octets ont été transmises et lire.
Essayer de mettre des pauses n'importe où vous êtes à l'arrêt de la prise de courant et avant de vous autoriser le programme à mettre fin à voir si cela aide.
FYI: "pipe" et "socket" sont des termes qui sont utilisés de façon interchangeable parfois.
Si vous pensez que vous savez la demande qui crée l'exception, pourquoi ne pouvez-vous pas essayer ce que j'ai suggéré au lieu d'essayer de créer un code qui vous donne un autre?
rcook est correct, on dirait que le client ne l'a pas pris la peine complètement consumimg la réponse avant de la quitter...vous pouvez souvent obtenir lorsqu'un utilisateur quitte une page avant qu'elle ait fini de se charger complètement
J'ai trouvé mon problème, c'est qu'il y a un paramètre de délai d'attente sur le côté client, du côté du client va fermer la connexion lorsque le temps d'attente dépasse. Après cela, le côté serveur veut vider la réponse pour le côté client, mais le flux est déjà fermé. Ainsi, le "broken pipe" la question qui s'est passé. Vous pouvez ajuster le côté client paramètre de délai d'attente pour éliminer ce scénario.
Donc, j'ai géré cette exception pour avertir niveau.
OriginalL'auteur arcy
Je suis d'accord avec @arcy, le problème est côté client, sur mon cas, c'était à cause de nginx, permettez-moi de préciser
Je suis l'aide de nginx comme le frontend (pour que je puisse distribuer la charge, ssl, etc ...) et à l'aide de
proxy_pass http://127.0.0.1:8080
de transmettre le cas des demandes de tomcat.Il y a une valeur par défaut pour la nginx variable
proxy_read_timeout
des années 60 qui devrait être suffisant, mais sur certains moments de pointe de mon installation d'erreur avec le java.io.IOException: Broken pipe la modification de la valeur de l'aide jusqu'à ce que la cause de racine (60 devrait être suffisant) peut être déterminée.NOTE: j'ai fait une nouvelle réponse donc j'ai pu développer un peu plus dans mon cas (c'était la seule mention que j'ai trouvé à propos de cette erreur sur internet après avoir regardé beaucoup)
OriginalL'auteur user322049
Fondamentalement, ce qui se passe, c'est que votre utilisateur est soit la fermeture de l'onglet du navigateur, ou de naviguer à l'extérieur vers une autre page, avant que la communication est terminée. Votre serveur web (Jetée) génère une exception, car il est impossible d'envoyer les octets restants.
Ce n'est pas une erreur sur la logique de l'application côté. C'est simplement dû au comportement de l'utilisateur. Il n'y a rien de mal dans votre code en soi.
Il y a deux choses que vous pouvez faire:
OriginalL'auteur Amrinder Arora
augmentation de la réponse.getBufferSize()
obtenir la taille de la mémoire tampon et de les comparer avec les octets que vous souhaitez transférer !
Bonjour , je suis à pratiquer cela , et c'est une seule ligne de réponse à cette question. N'réponse d'arcy fournir toutes les informations précieuses pour vous ? Connaissez-vous le point de la dénaturer ?
Il n'y a pas de
bufferSize()
méthode dans le JDK, ou l'une des variantes de l'orthographe, et "comparer [thebuffer taille] avec les octets que vous souhaitez transférer" est dénuée de sens. La réponse est un non-sens.édité ! le protocole de la méthode a été mal plus tôt!!!
envisager de laisser de l'extrait de code facile à suivre par l'OP, pour ma la longueur de la réponse ne dit rien au sujet de la réponse, donc c'est bien que c'est utile pour l'op, si ce n'est pas le cas, envisager la modification et, éventuellement, de la suppression de cette réponse. Droit de vote pour les écarts d'acquisition
OriginalL'auteur Vimalkumar Natarajan