使用Spark框架

时间:2016-04-05 16:11:32

标签: jetty spark-java

我尝试使用Spark framework将大型文件上传到网络应用程序,但我遇到内存不足错误。似乎spark正在缓存内存中的请求体。我希望将文件上传缓存在磁盘上,或者将请求作为流读取。

我尝试过使用Apache Commons FileUpload的streaming support,但看来调用request.raw()。getInputStream()会导致Spark将整个主体读入内存并返回一个InputStream视图那段记忆,由this code完成。根据文件中的注释,这样可以多次调用getInputStream。有没有办法改变这种行为?

2 个答案:

答案 0 :(得分:0)

简短的回答不是我能看到的。

SparkServerFactory构建JettyHandler,它具有私有静态类HttpRequestWrapper,而不是将InputStream处理到内存中。

所有静态东西意味着没有可用的扩展。

答案 1 :(得分:0)

我最近遇到了同样的问题,我发现你可以绕过缓存。我这样做有以下功能:

var allHolidays = ClientContext.Holidays.ToList();    
foreach (var holiday in clientDataObj.Holidays)
{
   Holiday existingHoliday =
                allHolidays.SingleOrDefault(h => string.Equals(h.Date, holiday.Date));
   /* ... */
}

已经使用 Spark 2.4 进行了测试。

我不熟悉Spark的内部工作方式,所以一个潜在的,这个函数的一个小缺点是你不知道你是否得到缓存的InputStream,缓存的版本是可重用的,非缓存的是不

为了解决这个缺点,我想你可以实现类似于以下的功能:

public ServletInputStream getInputStream(Request request) throws IOException {
    final HttpServletRequest raw = request.raw();
    if (raw instanceof ServletRequestWrapper) {
        return ((ServletRequestWrapper) raw).getRequest().getInputStream();
    }

    return raw.getInputStream();
}