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