You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tapestry.apache.org by Kaspar Fischer <fi...@inf.ethz.ch> on 2008/01/18 14:52:58 UTC

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: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


Re: Custom service to provide files from DB: getOutputStream() has already been called for this response

Posted by Kaspar Fischer <fi...@inf.ethz.ch>.
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