【问题标题】:ServletOutputStream memory heap error large file streamServletOutputStream 内存堆错误大文件流
【发布时间】:2015-12-31 14:15:38
【问题描述】:

您好,我使用此 XAgent 和此 SSJS 代码从服务器文件系统流式传输文件:

var filepath="c:/test/file.pdf"  //380MB of file
var extContext:javax.faces.context.ExternalContext = facesContext.getExternalContext();
var response:com.ibm.xsp.webapp.XspHttpServletResponse = extContext.getResponse();
var writer:javax.servlet.ServletOutputStream = response.getOutputStream();
   estensione=@Right(filepath,3).toLowerCase();
   fileName=@RightBack(filepath,"/");
   contentype="application/octet-stream";
   contentype=(estensione=="pdf")?"application/pdf":contentype;
   response.setContentType(contentype); // content type of data, for other binary see mime types or put "application/octet-stream"
   response.setHeader("Cache-Control", "no-cache");
   var filestream:java.io.File = new java.io.File(filepath); //for check file size
   var maxfilesize:long=20*1024*1024;
   var typestream= filestream.length()>maxfilesize?"attachment;":"inline;";
   response.setHeader("Content-Disposition" ,typestream+" filename=\"" + fileName+"\""); //31/12/2015 required if You need to pass it back as file
   response.setHeader("Content-Length", ""+filestream.length());
   var inStream:java.io.FileInputStream = new java.io.FileInputStream(filepath);
   var btbuffer:byte= new byte[32767];
   var ilen,bytesBuffered:int=0;
   while ((ilen=inStream.read(btbuffer))!=-1){
       writer.write(btbuffer,0,ilen)
       writer.flush(); //31/12/2015 - flush writer but don't work
   }
   inStream.close();
   writer.close();
  facesContext.responseComplete();

代码可以正常工作..但是当我们同时有 2 个或更多下载时, 服务器显示 HTTP JVM: java.lang.OutOfMemoryError: 因为我有 1024M NOTES.INI 设置。

真正的问题是 ServletOutputStream 使用内存 javaheap 中的总文件大小并在客户端下载终止或取消后释放它。 有人知道如何修复吗? 我已阅读此questionthis question 没有任何成功。

2016 年 1 月 4 日更新

在响应分配后我已经用这行代码解决了问题:

response.disableXspCache(false);

false 参数是强制性的!

最后我也删除了代码writer.close()

感谢 Sven this blog 和 Riand Philippe 的评论

【问题讨论】:

    标签: java servlets stream xpages xpages-ssjs


    【解决方案1】:

    XPages 运行时默认缓冲页面结果,直到整个页面完成。这允许运行时在发生错误时完全恢复结果,并发出错误消息。这是由 XspHttpServletResponse 完成的。

    您可以通过强制转换响应并在此类上调用 disableXspCache() 来更改此行为。

    【讨论】:

    • 谢谢 Philippe Riand...当我使用 disableXspCache() 函数时,我的代码无法正常工作。
    • 因此,如果您的内存容量不够,请通过 notes.ini 设置增加堆大小。使用 64 位 Domino 来避免 2G 限制。
    猜你喜欢
    • 2013-03-23
    • 1970-01-01
    • 2015-08-23
    • 2018-01-13
    • 2010-10-28
    • 2017-03-09
    • 1970-01-01
    • 2013-03-01
    • 2011-03-27
    相关资源
    最近更新 更多