java.io.IOException:断开的管道

我们目前正在将遗留应用程序迁移到Jetty。 我有一个关于破管的例外。

  • Java 6
  • 码头8.1.8
  • Spring 3.2.0
  • 我正在尝试将Glassfish Web应用程序迁移到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)

  • 为什么我有这个例外?
  • 如何在本地机器上重现此异常?

  • 对于“断开的管道”,最常见的原因是一台机器(通过套接字进行通信的一台机器)在通信完成之前关闭了套接字的末端。 其中大约一半是因为在该套接字上通信的程序已终止。

    如果发送字节的程序将其发送出去并立即关闭套接字或自行终止,则在传输和读取字节之前,套接字可能会停止工作。

    尝试在你关闭套接字的任何地方暂停,然后让程序终止以查看是否有帮助。

    仅供参考:“管道”和“插座”是有时可互换使用的术语。


    我同意@arcy,这个问题在客户端,对我的情况是因为nginx,让我详细说明我使用nginx作为前端(这样我可以分发load,ssl等等)并使用proxy_pass http://127.0.0.1:8080将相应的请求转发给tomcat。

    对于60s的nginx变量proxy_read_timeout ,默认值应该足够了,但是在某些高峰时刻,我的设置会出现java.io.IOException错误:修改该值的proxy_read_timeout管道将有助于根本原因(60s应该足够长)可以修复。

    注:我做了一个新的答案,所以我可以扩大一点与我的情况(这是唯一提到我发现有关这个错误后,在互联网上看了很多)


    增加response.getBufferSize()获取缓冲区大小并与要传输的字节进行比较!

    链接地址: http://www.djcxy.com/p/61705.html

    上一篇: java.io.IOException: Broken pipe

    下一篇: How to avoid exception on disconnect for JDBC driver?