尝试使用 Spring RestTemplate 消耗大量 JSON 数据导致 java 堆 space 异常

Trying to consume HUGE JSON data using Spring RestTemplate resulting in java heap space exception

我正在使用 Resttemplate 从外部服务器消耗大量 json。当数据集不大时,我的代码工作正常,但一旦我 运行 它针对完整数据集,我就无法将响应映射到 bean class。下面是我的代码。

public void createCustomCsv(String name, String password, String serverUrl1, String serverUrl2, String propLocation)
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setBufferRequestBody(false);

RestTemplate restTemplate = new RestTemplate();
restTemplate.setRequestFactory(requestFactory);

HttpHeaders httpHeaders = customHeaders.createCustomHeaders(name, password);

List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
 //Add the required converters
messageConverters.add(new MappingJackson2HttpMessageConverter());
messageConverters.add(new StringHttpMessageConverter());
 //Add the message converters to the restTemplate
restTemplate.setMessageConverters(messageConverters); 

ResponseEntity<MyDataBean> responseEntity1;
ResponseEntity<MyDataBean> responseEntity2;
try {
    long startTime = System.currentTimeMillis();
    jLog.debug("Start mapping to Pojo :: " +startTime);
    responseEntity1 = restTemplate.exchange(serverUrl1, HttpMethod.GET, httpEntity, MyDataBean.class);
 responseEntity2 = restTemplate.exchange(serverUrl2, HttpMethod.GET, httpEntity, MyDataBean.class);


MyDataBean sampleDataBeanServer1 = responseEntity1 .getBody();
MyDataBean sampleDataBeanServer2 = responseEntity2 .getBody();


processCustomData(sampleDataBeanServer1 , propLocation);
processCustomData(sampleDataBeanServer2 , propLocation);
} catch (RestClientException e) {

    jLog.debug("Something went wrong with ws call:::" +e);
}
}

我已经尝试了几个小时,并在 SO 中进行了搜索,试图找到一种方法将响应数据解析到 Pojo class 而不会出现内存异常。我知道这可能是因为整个响应都保留在内存中以将其映射到 Pojo。下面的代码是发现内存问题的地方。

 responseEntity1 = restTemplate.exchange(serverUrl1, HttpMethod.GET, httpEntity, MyDataBean.class); 

根据文档,我还将 BufferRequestBody 设置为 false,这样响应就不会加载到内存中。我不确定为什么行为与文档相比有所不同。

 SimpleClientHttpRequestFactory requestFactory = new  SimpleClientHttpRequestFactory();
 requestFactory.setBufferRequestBody(false);

如果有人有耐心和好心帮我解决这个问题就好了!我也愿意接受任何第三方图书馆的建议。

P.N: 当数据集不大时,上面的代码工作完美。为简洁起见,还省略了 bean class 代码。

要处理大文件,您必须通过直接从响应流中读取来下载文件。这 可能会有所帮助。然后使用缓冲 reader 分批读取下载的文件,并将它们放入您的实体中,然后进行处理。

您将无法在一批中处理它们,因为它们不适合内存。