Использование StreamingResponseBody и ContentCachingResponseWrapper - PullRequest
0 голосов
/ 26 марта 2020

Я пытаюсь реализовать потоковый HTTP API, используя StreamingResponseBody. У меня также есть Filter, который упаковывает HttpServletRequest и HttpServletResponse, используя ContentCachingRequestWrapper и ContentCachingResponseWrapper.

Когда я отключаю фильтр, он работает абсолютно как положено. Однако с включенным фильтром я вообще не получаю ответ. Иногда я получаю частичный ответ - особенно при запуске API.

Кроме того, если я не оберну свои HttpServletRequest и HttpServletResponse с ContentCachingRequestWrapper и ContentCachingResponseWrapper, это сработает!

Это мой пример API потоковой передачи:

response.setContentType(MediaType.APPLICATION_STREAM_JSON_VALUE);
StreamingResponseBody stream = out -> {
    ObjectMapper mapper = new ObjectMapper();
    for(int i = 0; i < 100; i++) {
        try {
            Foo foo = Foo.builder().name("John").email("john@doe.com").build();
            String fooS = mapper.writeValueAsString(foo);
            out.write(fooS.getBytes());
            out.flush();

            TimeUnit.MILLISECONDS.sleep(50);

            Bar bar = Bar.builder().desc("This is some random desc - " + i).build();
            String barS = mapper.writeValueAsString(bar);
            out.write(barS.getBytes());
            out.flush();

        }catch (IOException | InterruptedException e) {
            LOGGER.error("[+] failed to stream data with error: {}", e.getMessage());
            Thread.currentThread().interrupt();
        }
    }
};

return new ResponseEntity<>(stream, HttpStatus.OK);

и это моя реализация фильтра:

long startTime = System.currentTimeMillis();
ContentCachingRequestWrapper request = new ContentCachingRequestWrapper(httpServletRequest);
ContentCachingResponseWrapper response = new ContentCachingResponseWrapper(httpServletResponse);
try {
    filterChain.doFilter(request, response);
} finally {
    //restInboundLogProcessor.log(startTime, request, response);
    response.copyBodyToResponse();
}

Я не могу понять, почему я не получаю ответ или редко частичный ответ. Очень ценится!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...