【发布时间】:2023-03-18 17:59:01
【问题描述】:
我有一个 Web 服务器项目,尝试下载大文件时出现异常。该文件通过流读取和写入到 ServletOutputStream。
示例代码:
private void readFromInput(BufferedInputStream fis,
ServletOutputStream sout) throws IOException
{
byte[] buf = new byte[4096];
int c = 0;
while ((c = fis.read(buf)) != -1)
{
sout.write(buf, 0, c);
}
fis.close();
}
当我查看回溯时,我看到一些过滤器被执行。
这是异常的一些部分:
javax.servlet.ServletException: #{DownloaderBean.actionDownload}:
java.lang.OutOfMemoryError: Java heap space
javax.faces.webapp.FacesServlet.service(FacesServlet.java:256)
org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:144)
org.ajax4jsf.framework.ajax.xmlfilter.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:127)
org.ajax4jsf.framework.ajax.xmlfilter.BaseFilter.doFilter(BaseFilter.java:277)
....
....
....
java.lang.OutOfMemoryError: Java heap space
java.io.ByteArrayOutputStream.write(Unknown Source)
org.apache.myfaces.webapp.filter.ExtensionsResponseWrapper$MyServletOutputStream.write(ExtensionsResponseWrapper.java:135)
当我查看 ExtensionFilter 代码时:
这个页面有一个部分:
"When the ExtensionsFilter is enabled, and the DefaultAddResources implementation is
used then there is no way to avoid having the response buffered in memory"
我猜这些过滤器会缓冲堆上的响应并导致问题。有没有办法阻止此过滤器应用于特定页面/链接?还是我应该采用另一种方式来处理这个问题?
【问题讨论】:
-
下载是由ajax请求触发的吗?