From tapestry-user Sat Jan 19 16:52:36 2008 From: Kaspar Fischer Date: Sat, 19 Jan 2008 16:52:36 +0000 To: tapestry-user Subject: Re: Custom service to provide files from DB: getOutputStream() has already been called for this resp Message-Id: X-MARC-Message: https://marc.info/?l=tapestry-user&m=120076159412076 A closer inspection showed that my exception is always preceeded by a ClientAbortException: Caused by: ClientAbortException: java.net.SocketException: Broken pipe at org.apache.catalina.connector.OutputBuffer.realWriteBytes (OutputBuffer.java:366) at org.apache.tomcat.util.buf.ByteChunk.flushBuffer (ByteChunk.java:432) at org.apache.catalina.connector.OutputBuffer.doFlush (OutputBuffer.java:314) at org.apache.catalina.connector.OutputBuffer.flush (OutputBuffer.java:293) at org.apache.catalina.connector.CoyoteOutputStream.flush (CoyoteOutputStream.java:98) at org.icarbasel.tapestry.knowledgecenter.services.AlfrescoFileService.serv ice(AlfrescoFileService.java:115) ... 37 more So it's just the browser aborting the connection. My code now ignores the exception completely. P.S. A small issue with Tomcat made it hard to catch this exception, see http://forum.java.sun.com/thread.jspa? threadID=710086&messageID=4110420 Hope this helps others. On 18.01.2008, at 14:52, Kaspar Fischer wrote: > Hi! > > I have a custom service that downloads images/files from a DB: > > public void service(IRequestCycle cycle) throws IOException > { > // extract node-ref > String nodeUID = cycle.getParameter("node"); > NodeRef nodeRef = new NodeRef(NODE_REF_PREFIX + nodeUID); > > try { > // login to DB > // ... > content = ...; > > // get stream to content > InputStream contentStream = content.getContent(); > response.setContentType(content.getContentMimeType()); > response.setContentLength(new Long(content.getContentSize > ()).intValue()); > ServletOutputStream out = response.getOutputStream(); > > // transmit > final int SIZE = 10 * 1024; > byte[] buffer = new byte[SIZE]; > int i; > while ((i = contentStream.read(buffer)) != -1) > out.write(buffer, 0, i); > contentStream.close(); > out.close(); > > } catch (Exception e) { > throw new ApplicationRuntimeException("Could not deliver file > "+ nodeRef + ".", e); > } > } > > When I heavily load files (clicking reload many times in fast > succession), I get > > ERROR http-80-Processor21 org.apache.catalina.core.ContainerBase. > [Catalina].[localhost].[/kc].[kc] - Servlet.service() for servlet > kc threw exception > java.lang.IllegalStateException: getOutputStream() has already been > called for this response > at org.apache.catalina.connector.Response.getWriter > (Response.java:601) > at org.apache.catalina.connector.ResponseFacade.getWriter > (ResponseFacade.java:196) > at org.apache.tapestry.web.ServletWebResponse.getPrintWriter > (ServletWebResponse.java:116) > at $WebResponse_1178d289d55.getPrintWriter > ($WebResponse_1178d289d55.java) > at $WebResponse_1178d289ccb.getPrintWriter > ($WebResponse_1178d289ccb.java) > at > org.apache.tapestry.services.impl.DefaultResponseBuilder.renderRespons > e(DefaultResponseBuilder.java:140) > at > org.apache.tapestry.services.impl.ResponseRendererImpl.renderResponse( > ResponseRendererImpl.java:33) > at $ResponseRenderer_1178d289ce3.renderResponse > ($ResponseRenderer_1178d289ce3.java) > at > org.apache.tapestry.error.ExceptionPresenterImpl.presentException > (ExceptionPresenterImpl.java:48) > at $ExceptionPresenter_1178d289cd4.presentException > ($ExceptionPresenter_1178d289cd4.java) > at $ExceptionPresenter_1178d289cd3.presentException > ($ExceptionPresenter_1178d289cd3.java) > at > org.apache.tapestry.engine.AbstractEngine.activateExceptionPage > (AbstractEngine.java:117) > at org.apache.tapestry.engine.AbstractEngine.service > (AbstractEngine.java:269) > at > org.apache.tapestry.services.impl.InvokeEngineTerminator.service > (InvokeEngineTerminator.java:54) > at $WebRequestServicer_1178d289d2d.service > ($WebRequestServicer_1178d289d2d.java) > at $WebRequestServicer_1178d289d29.service > ($WebRequestServicer_1178d289d29.java) > at > org.apache.tapestry.services.impl.WebRequestServicerPipelineBridge.ser > vice(WebRequestServicerPipelineBridge.java:61) > at $ServletRequestServicer_1178d289d0f.service > ($ServletRequestServicer_1178d289d0f.java) > at > org.apache.tapestry.request.DecodedRequestInjector.service > (DecodedRequestInjector.java:55) > at $ServletRequestServicerFilter_1178d289d0b.service > ($ServletRequestServicerFilter_1178d289d0b.java) > at $ServletRequestServicer_1178d289d11.service > ($ServletRequestServicer_1178d289d11.java) > at > org.apache.tapestry.multipart.MultipartDecoderFilter.service > (MultipartDecoderFilter.java:52) > at $ServletRequestServicerFilter_1178d289d09.service > ($ServletRequestServicerFilter_1178d289d09.java) > at $ServletRequestServicer_1178d289d11.service > ($ServletRequestServicer_1178d289d11.java) > at > org.apache.tapestry.services.impl.SetupRequestEncoding.service > (SetupRequestEncoding.java:53) > at $ServletRequestServicerFilter_1178d289d0d.service > ($ServletRequestServicerFilter_1178d289d0d.java) > at $ServletRequestServicer_1178d289d11.service > ($ServletRequestServicer_1178d289d11.java) > at $ServletRequestServicer_1178d289d03.service > ($ServletRequestServicer_1178d289d03.java) > at org.apache.tapestry.ApplicationServlet.doService > (ApplicationServlet.java:126) > at org.apache.tapestry.ApplicationServlet.doGet > (ApplicationServlet.java:103) > at javax.servlet.http.HttpServlet.service(HttpServlet.java: > 690) > > > Does anybody know what could be the reason for this? It does not > occur when I > do one request after the other with pauses in between. > > It seems to be something tapestry-specific as I am not calling > getOutputStream() stream > twice! Or is my service() called twice? But why? > > Many thanks in advance for any pointers! > Kaspar --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org For additional commands, e-mail: users-help@tapestry.apache.org