org.mortbay.jetty.EofException gets thrown when writing to response

Vladimir picture Vladimir · Feb 9, 2012 · Viewed 10.5k times · Source

I am using jetty 6.1.23 within eclipse RAP (Rich Ajax Platform 1.3.2) and Java version 1.5. I am sending a PNG image to the browser. These are pieces of code that are causing trouble:

server side:

response.setContentType(application.getMimeType(".png"));
response.setContentLength(outputSize);
response.setHeader("Cache-Control", "no-cache"); 
response.setDateHeader("Expires", 0);
response.setHeader("Pragma", "no-cache");
response.setDateHeader("Max-Age", 0); 
ServletOutputStream servletoutputstream = response.getOutputStream();

servletoutputstream.write(imageBytes); // this throws EofException

servletoutputstream.flush();

client side:

<img src="path to the servlet that is loading the image">

The thing that's weird is that this problem does not happen all the time. It happens intermittently after we moved to production. There were no problems in our test environment. The only difference between production and our test environment is that in production environment, users are far away from our servers, while in the test environment, they are very close.

When the exception gets thrown, image does not get displayed at all at the client's browser end! What is going on? What can I do to fix it or at least have a workaround?

This is the full exception trace (I highlighted key exceptions):

08 Feb 2012 11:49:08,955 ERROR [1584291438@qtp-2135195460-260] plugin.sda - 
org.mortbay.jetty.EofException
    at org.mortbay.jetty.HttpGenerator.flush(HttpGenerator.java:789)
    at org.mortbay.jetty.AbstractGenerator$Output.flush(AbstractGenerator.java:568)
    at org.mortbay.jetty.HttpConnection$Output.flush(HttpConnection.java:1006)
    at org.mortbay.jetty.AbstractGenerator$Output.write(AbstractGenerator.java:650)
    at org.mortbay.jetty.AbstractGenerator$Output.write(AbstractGenerator.java:590)
    at com.scotiabank.ebss.common.viewer.util.ViewerUtil.sendBytes(ViewerUtil.java:533)
    at com.scotiabank.ebss.common.viewer.servlets.ViewerServlet.doGet(ViewerServlet.java:242)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at org.eclipse.equinox.http.registry.internal.ServletManager$ServletWrapper.service(ServletManager.java:180)
    at org.eclipse.equinox.http.servlet.internal.ServletRegistration.service(ServletRegistration.java:61)
    at org.eclipse.equinox.http.servlet.internal.ProxyServlet.processAlias(ProxyServlet.java:126)
    at org.eclipse.equinox.http.servlet.internal.ProxyServlet.service(ProxyServlet.java:60)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at org.eclipse.equinox.http.jetty.internal.HttpServerManager$InternalHttpServiceServlet.service(HttpServerManager.java:318)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:390)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:326)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:924)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:549)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
Caused by: java.io.IOException: Broken pipe
    at sun.nio.ch.FileDispatcher.writev0(Native Method)
    at sun.nio.ch.SocketDispatcher.writev(SocketDispatcher.java:61)
    at sun.nio.ch.IOUtil.write(IOUtil.java:192)
    at sun.nio.ch.SocketChannelImpl.write0(SocketChannelImpl.java:393)
    at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:416)
    at java.nio.channels.SocketChannel.write(SocketChannel.java:375)
    at org.mortbay.io.nio.ChannelEndPoint.flush(ChannelEndPoint.java:232)
    at org.mortbay.io.nio.SelectChannelEndPoint.flush(SelectChannelEndPoint.java:211)
    at org.mortbay.jetty.HttpGenerator.flush(HttpGenerator.java:712)
    ... 27 more

Answer

Tim picture Tim · Feb 9, 2012

The problem appears to be network related, and has little-to-nothing to do with Jetty.

You are attempting to write an amount of data to a network socket that has been closed at the other end. That is what the Broken pipe exception means.

You need to work out why the HTTP connection is closing unexpectedly. It's possible that the cause has something to do with Jetty, but I strongly suspect not.