byte [] продолжает накапливать данные во время потоковой передачи и не выдвигать только текущие данные - PullRequest
1 голос
/ 14 мая 2019

Я использую Java 8, Spring 4.3.x и Tomcat 7.

Ниже приведен мой код для потоковой передачи огромных данных из базы данных в виде кусков.

public ResponseEntity<StreamingResponseBody> streamRecords(HttpServletRequest request, 
            HttpServletResponse response,....) 
    throws Exception {      
    int recordSize = 5000;
    int pageSize = 1000;
    StreamingResponseBody responseBody = outputStream -> {
        byte[] bytes = null;
        for (int skip = 0 ; skip <= recordSize ; skip += pageSize) {
            logger.error("SKIP: " + skip);
            try {
                JsonObject records = new JsonObject();
                .
                .//somewhere down the call is below code
                .//dbCursor = dbCollection.find().skip(skip).limit(pageSize);
                .
                .
                .
                bytes = records.toString().getBytes();
                outputStream.write(bytes);
                outputStream.flush();
                logger.error("BYTE LENGTH: " + bytes.length);
            } catch (Exception e) {
                    logger.error("Exception occured while streaming records: " + e.getMessage() + "\n", e);
                    outputStream.close();
            }
        }
        outputStream.close();
    };
    return ResponseEntity.ok()
            .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=sample.csv")
            .contentType(MediaType.APPLICATION_JSON)
            .body(responseBody);
}

ПРИМЕЧАНИЕ. Используется выходной поток CoyoteOutputStream.java

Фактическая мощность указана ниже,

2019-05-14/15:48:30.850/IST[MvcAsync1] ERROR - SKIP: 0
2019-05-14/15:48:49.596/IST[MvcAsync1] ERROR - BYTE LENGTH: 282462
2019-05-14/15:48:49.606/IST[MvcAsync1] ERROR - SKIP: 1000
2019-05-14/15:49:07.777/IST[MvcAsync1] ERROR - BYTE LENGTH: 565633
2019-05-14/15:49:07.793/IST[MvcAsync1] ERROR - SKIP: 2000
2019-05-14/15:49:26.426/IST[MvcAsync1] ERROR - BYTE LENGTH: 849231
2019-05-14/15:49:26.433/IST[MvcAsync1] ERROR - SKIP: 3000
2019-05-14/15:49:45.595/IST[MvcAsync1] ERROR - BYTE LENGTH: 1132467
2019-05-14/15:49:45.625/IST[MvcAsync1] ERROR - SKIP: 4000
2019-05-14/15:50:03.962/IST[MvcAsync1] ERROR - BYTE LENGTH: 1416003
2019-05-14/15:50:03.996/IST[MvcAsync1] ERROR - SKIP: 5000
2019-05-14/15:50:24.028/IST[MvcAsync1] ERROR - BYTE LENGTH: 1699420

Ожидаемый объем производства, как показано ниже.

2019-05-14/15:48:30.850/IST[MvcAsync1] ERROR - SKIP: 0
2019-05-14/15:48:49.596/IST[MvcAsync1] ERROR - BYTE LENGTH: 282462
2019-05-14/15:48:49.606/IST[MvcAsync1] ERROR - SKIP: 1000
2019-05-14/15:49:07.777/IST[MvcAsync1] ERROR - BYTE LENGTH: 292462
2019-05-14/15:49:07.793/IST[MvcAsync1] ERROR - SKIP: 2000
2019-05-14/15:49:26.426/IST[MvcAsync1] ERROR - BYTE LENGTH: 282462
2019-05-14/15:49:26.433/IST[MvcAsync1] ERROR - SKIP: 3000
2019-05-14/15:49:45.595/IST[MvcAsync1] ERROR - BYTE LENGTH: 292462
2019-05-14/15:49:45.625/IST[MvcAsync1] ERROR - SKIP: 4000
2019-05-14/15:50:03.962/IST[MvcAsync1] ERROR - BYTE LENGTH: 282462
2019-05-14/15:50:03.996/IST[MvcAsync1] ERROR - SKIP: 5000
2019-05-14/15:50:24.028/IST[MvcAsync1] ERROR - BYTE LENGTH: 292462

Байты должны быть свежей копией текущего фрагмента, но каким-то образом он также принимает предыдущие фрагменты, пока я пишу в outputStream. согласно recordSize, я ожидаю 5000 записей, но я получаю 21000 записей.

Любые предложения будут очень полезны.

...