Re: Custom service to provide files from DB: getOutputStream() has already been called for this response
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=710086messageID=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
Custom service to provide files from DB: getOutputStream() has already been called for this response
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.renderResponse( 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.servi ce(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: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]