restTemplate 发文件 java.lang.OutOfMemoryError: Java heap space
使用RestTemplate实现跨服务大文件上传,大概2G@Configurationpublic class RestTemplateConfig {@Beanpublic RestTemplate restTemplate() {SimpleClientHttpRequestFactory requestFactory = new Simpl...
·
使用RestTemplate实现跨服务大文件上传,大概2G
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate() {
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setBufferRequestBody(false);
RestTemplate rest = new RestTemplate(requestFactory);
return rest;
}
@Bean
public MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
// 单个数据大小
factory.setMaxFileSize(DataSize.ofGigabytes(2));
/// 总上传数据大小
factory.setMaxRequestSize(DataSize.ofGigabytes(2));
return factory.createMultipartConfig();
}
}
有了上面的代码,下面的配置文件里面就不用配置了,也就是下面的可以删掉了
#单个文件的最大上限
spring.servlet.multipart.max-file-size = 2048MB
#单个请求的文件总大小上限
spring.servlet.multipart.max-request-size=2048MB
1. 为什么?
如果单单是文件上传上述的两行配置文件的确可以满足需求,但是我们如果用RestTemplate跨服务传输文件就会有问题了,会报错,如下
java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3236)
at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118)
at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153)
at org.springframework.util.StreamUtils.copy(StreamUtils.java:128)
at org.springframework.http.converter.ResourceHttpMessageConverter.writeContent(ResourceHttpMessageConverter.java:115)
at org.springframework.http.converter.ResourceHttpMessageConverter.writeInternal(ResourceHttpMessageConverter.java:107)
at org.springframework.http.converter.ResourceHttpMessageConverter.writeInternal(ResourceHttpMessageConverter.java:50)
at org.springframework.http.converter.AbstractHttpMessageConverter.write(AbstractHttpMessageConverter.java:227)
at org.springframework.web.client.RestTemplate$HttpEntityRequestCallback.doWithRequest(RestTemplate.java:849)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:617)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:580)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:498)
2.怎么解决
添加配置文件即可
@Bean
public RestTemplate restTemplate() {
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setBufferRequestBody(false);
RestTemplate rest = new RestTemplate(requestFactory);
return rest;
}
该代码的意思是请求工厂类是否应用缓冲请求正文内部,默认值为true,当post或者put大文件的时候会造成内存溢出情况,设置为false将数据直接流入底层HttpURLConnection。
参考:
https://blog.csdn.net/qq_39455116/article/details/97778326
https://github.com/spring-projects/spring-framework/issues/12564
更多推荐
所有评论(0)