【发布时间】:2018-12-28 05:17:48
【问题描述】:
我正在构建一个用于上传大文件(数 GB)的反向代理,因此希望使用不缓冲整个文件的流模型。大缓冲区会引入延迟,更重要的是,它们可能会导致内存不足错误。
我的客户端类包含
@Autowired private RestTemplate restTemplate;
@Bean
public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) {
int REST_TEMPLATE_MODE = 1; // 1=streams, 2=streams, 3=buffers
return
REST_TEMPLATE_MODE == 1 ? new RestTemplate() :
REST_TEMPLATE_MODE == 2 ? (new RestTemplateBuilder()).build() :
REST_TEMPLATE_MODE == 3 ? restTemplateBuilder.build() : null;
}
和
public void upload_via_streaming(InputStream inputStream, String originalname) {
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setBufferRequestBody(false);
restTemplate.setRequestFactory(requestFactory);
InputStreamResource inputStreamResource = new InputStreamResource(inputStream) {
@Override public String getFilename() { return originalname; }
@Override public long contentLength() { return -1; }
};
MultiValueMap<String, Object> body = new LinkedMultiValueMap<String, Object>();
body.add("myfile", inputStreamResource);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(body,headers);
String response = restTemplate.postForObject(UPLOAD_URL, requestEntity, String.class);
System.out.println("response: "+response);
}
这是可行的,但请注意我的 REST_TEMPLATE_MODE 值控制它是否满足我的流式传输要求。
问题:为什么REST_TEMPLATE_MODE == 3 会导致全文件缓冲?
参考资料:
- How to forward large files with RestTemplate?
- How to send Multipart form data with restTemplate Spring-mvc
- Spring - How to stream large multipart file uploads to database without storing on local file system -- 建立 InputStream
- How to autowire RestTemplate using annotations
- Design notes and usage caveats, also:
restTemplatedoes not support streaming downloads
【问题讨论】:
-
顺便说一句:通过观察以下症状检测到全文件缓冲:延迟和服务器内存配置文件。
-
关于“最适合
ClientHttpRequestFactory”的有趣描述:Class RestTemplateBuilder -
我觉得很有趣
setBufferRequestBody(false)不保证这个结果。
标签: spring spring-boot streaming reverse-proxy resttemplate