【发布时间】:2016-06-21 08:59:12
【问题描述】:
我有一个大型文件下载,由一台服务器上的 RestController 提供服务,我需要通过另一台服务器上的 RestController 进行流式传输。当直接调用终端服务器时,结果流很好。但是,当使用 RestTemplate 调用此服务器然后将响应写入 OutputStream 时,响应会在前端服务器上缓冲,直到整个文件准备好,然后流式传输。有没有办法可以将文件写入到 OutputStream 中?
目前我在前端服务器上的代码与此类似
@ResponseBody
public void downloadResults(HttpServletRequest request, HttpServletResponse response, @RequestParam("id") String jobId, OutputStream stream)
throws IOException
{
byte[] data = restTemplate.exchange("http://localhost/getFile", HttpMethod.POST, requestEntity, byte[].class, parameters).getBody();
stream.write(data);
}
我已将我的 RestTemplate 设置为不缓冲,并通过检查所使用的请求类型 (SimpleStreamingClientHttpRequest) 来验证这是否有效。 数据全部返回正确,它只是一次全部写入流,而不是当它进来时
【问题讨论】:
-
不确定使用
RestTemplate是正确的方法,因为它读取响应来构造实体 - 尝试其他方法,例如HttpClient -
它必须是
RestTemplate,因为我通过 Zuul 代理请求,所以需要使用他们的ClientHttpRequestInterceptor- 除非我仍然可以使用带有HttpClient的拦截器? -
我已经解决了我的问题,而不是使用
RestTemplate我使用HttpUrlConnection发出基本的http 请求,使用EurekaClient检索正确的代理路由。在网上看,@shachar 似乎是正确的,并且 RestTemplate 总是会产生缓冲作用,因为它试图将响应包装在HttpEntity中并且必须等待所有数据准备好
标签: java spring spring-boot outputstream spring-cloud-netflix