Używam pomostu 6.1.23 w środowisku Eclipse RAP (Rich Ajax Platform 1.3.2) i Java w wersji 1.5. Wysyłam obraz PNG do przeglądarki. Są to fragmenty kodu, które powodują problemy:org.mortbay.jetty.EofException jest generowany podczas pisania do odpowiedzi
po stronie serwera:
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();
po stronie klienta:
<img src="path to the servlet that is loading the image">
Rzecz to dziwne jest to, że problem ten nie zdarzają się cały czas. Zdarza się sporadycznie po tym, jak przenieśliśmy się do produkcji. W naszym środowisku testowym nie wystąpiły żadne problemy. Jedyną różnicą między produkcją a naszym środowiskiem testowym jest to, że w środowisku produkcyjnym użytkownicy są daleko od naszych serwerów, podczas gdy w środowisku testowym są bardzo blisko.
Po zgłoszeniu wyjątku obraz nie wyświetla się wcale po stronie przeglądarki klienta! Co się dzieje? Co mogę zrobić, aby to naprawić lub co najmniej obejść?
Jest to pełna ślad wyjątek (I podkreślił najważniejsze wyjątki):
08 Feb 2012 11:49:08,955 ERROR [[email protected]] 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
Wyjątkiem jest analfabetka. Rzeczywistym problemem jest "potłuczona rura", która nie ma nic wspólnego z EOF. – EJP