使用StreamingResponseBody和ContentCachingResponseWrapper

时间:2020-03-26 13:01:59

标签: spring spring-boot spring-mvc

我正在尝试使用StreamingResponseBody实现流HTTP API。我也有一个Filter,它使用HttpServletRequestHttpServletResponse包装ContentCachingRequestWrapperContentCachingResponseWrapper

当我禁用过滤器时,它绝对可以正常工作。但是,启用过滤器后,我什么也没有得到响应。有时我会得到部分响应-特别是在API启动时。

此外,如果我不将HttpServletRequestHttpServletResponseContentCachingRequestWrapperContentCachingResponseWrapper包裹起来,那行得通!

这是我的示例流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();
}

我似乎无法弄清楚为什么我没有得到答复,或者很少得到部分答复。非常感谢!

0 个答案:

没有答案