Я пытаюсь реализовать потоковый 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();
}
Я не могу понять, почему я не получаю ответ или редко частичный ответ. Очень ценится!