Потоковые данные в ответ для Spring MVC 4.3 с использованием Java 8, Tomcat 7 - PullRequest
0 голосов
/ 23 апреля 2019

Ниже приведен фрагмент кода, который вызывает проблему OutOfMemory, когда я запускаю xyz.war в tomcat 7 с Java 8.

В приведенном ниже коде я создаю CSV-ответ данных, которые были извлечены из MongoDB через курсор.

@RequestMapping(value = "/elements/{elementname}/records", method = RequestMethod.GET)
public ModelAndView getAllRecords(
  HttpServletRequest request, HttpServletResponse response,
  @RequestParam(value = "customerid", required = true) long customerId,
  @RequestParam(value = "userid", required = true) long userId,
  @RequestParam(value = "query", required = false) String query,
  throws Exception {
    Map < String, Object > model = new HashMap < String, Object > ();
    JsonObject records = elementService.searchRecords(query);
    ModelAndViewData msvd = elementService.commonRestService
                                .getModelAndView("dataObject", "streamingView");
    return new ModelAndView(msvd.getViewName(), handleCsvReportTypeRequest(records, customerId, userId));
}

public Map < String, Object > handleCsvReportTypeRequest(JsonObject records,
        String elementName, long customerId, long userId) throws Exception {
    StringBuffer csvData = new StringBuffer();
    // create csv data
    ModelAndViewData modelAndStreamingViewData = commonRestService.getModelAndView(
    "dataObject", "streamingView");
    byte[] byteArray = String.valueOf(csvData).getBytes();
    InputStream byteArrayInputStream = new ByteArrayInputStream(byteArray);
    model.put(modelAndStreamingViewData.getModelAttributeName(), byteArrayInputStream);

    model.put(DownloadConstants.CONTENT_TYPE, DownloadConstants.CSV_CONTENT_TYPE);
    model.put(DownloadConstants.FILENAME, "XYZ.csv");
    model.put(DownloadConstants.LAST_MODIFIED, new Date(System.currentTimeMillis()));
    model.put(DownloadConstants.CONTENT_LENGTH, Integer.valueOf(byteArray.length));
    return model;
}

Как я могу передавать данные CSV обратно пользователю, не создавая огромные данные в памяти и затем передавая пользователю?

1 Ответ

0 голосов
/ 23 апреля 2019

Используйте буферизованное чтение и запись ответа в объект HttpResponse.

Попробуйте следующим образом: Spring MVC: большие файлы для загрузки, OutOfMemoryException

...