myfaces-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Shane Petroff <sh...@mayet.ca>
Subject File download and out of memory
Date Wed, 05 Dec 2007 00:50:36 GMT
Hello,

I'm having a problem with a link used to download a "large" file. I say 
large in quotation because by modern standards, the 5MB file I'm talking 
about is tiny; I need to be able to handle at least 20MB. The same code 
works for small files (<25K), but dies on larger ones. Hopefully it is a 
configuration issue. On the jsp, there is a commandLink bound to the 
"onDownload" action pasted below. The only config I can imagine that 
might come into play is configuring the extensions filter itself. I've 
specified UTF-8 encodings by default since several pages must support 
extended characters. I'm currently using MyFaces core 1.1.5, Tomahawk 
1.1.6 and Tomcat 5.5.23

The stack trace is:
java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:2882)
    at 
java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:100)
    at 
java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:572)
    at java.lang.StringBuffer.append(StringBuffer.java:320)
    at 
org.apache.myfaces.shared_tomahawk.renderkit.html.util.UnicodeEncoder.encode(UnicodeEncoder.java:54)
(full stack trace below)

Extension Filter config:
    <filter>
        <filter-name>MyFacesExtensionsFilter</filter-name>
        
<filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>
        <init-param>
            <param-name>maxFileSize</param-name>
            <param-value>90m</param-value>
        </init-param>
        <init-param>
            <param-name>uploadMaxFileSize</param-name>
            <param-value>90m</param-value>
        </init-param>
    </filter>

Action code:
    public String onDownload()
    {
        String rtn = Constants.ERROR_OUTCOME;
        FileInputStream fis = null;
        OutputStream os = null;
        try
        {
            File file = buildFile(); // creates a 5MB file. If I hack 
this to return a 25K file, it all works well

            FacesContext fc = FacesContext.getCurrentInstance();
            HttpServletResponse response = (HttpServletResponse) 
fc.getExternalContext().getResponse();
            response.setHeader("Content-disposition", "attachment; 
filename=" + file.getName());
            response.setContentType("application/xml");

            fis = new FileInputStream(file);
            os = new BufferedOutputStream(response.getOutputStream());

            int read;
            while( (read = fis.read()) != -1 )
                os.write(read);

            os.flush();
            fc.responseComplete();
            rtn = Constants.SUCCESS_OUTCOME;
        }
        catch ( Exception e )
        {
            logException( MessageConstants.LOADING_ERROR_PREFIX + "XML", 
e );
        }
        finally
        {
            try
            {
                os.close();
                fis.close();
            }
            catch(Exception ignored) { /* we don't care about NPE's 
either */ }
        }

        return rtn;
    }

Full Stack Trace:
java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:2882)
    at 
java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:100)
    at 
java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:572)
    at java.lang.StringBuffer.append(StringBuffer.java:320)
    at 
org.apache.myfaces.shared_tomahawk.renderkit.html.util.UnicodeEncoder.encode(UnicodeEncoder.java:54)
    at 
org.apache.myfaces.shared_tomahawk.renderkit.html.HtmlResponseWriterImpl.write(HtmlResponseWriterImpl.java:567)
    at 
org.apache.myfaces.renderkit.html.util.DefaultAddResource.writeResponse(DefaultAddResource.java:847)
    at 
org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:162)
    at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
    at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
    at 
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:173)
    at 
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)
    at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
    at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
    at 
ca.mayet.SessionTimeoutRedirectFilter.doFilter(SessionTimeoutRedirectFilter.java:78)
    at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
    at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
    at 
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210)
    at 
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
    at 
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at 
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
    at 
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
    at 
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
    at 
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:870)
    at 
org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
    at 
org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
    at 
org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
    at 
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685)
    at java.lang.Thread.run(Thread.java:619)

-- 
Shane


Mime
View raw message