Tôi có một ứng dụng khách cần đăng một số lượng lớn tệp json lớn lên máy chủ. Tôi đã có thể làm cho nó hoạt động bằng cách đọc từng tệp trong bộ nhớ và đăng toàn bộ tệp bằng RestTemplate. Tuy nhiên, máy khách nhanh chóng hết bộ nhớ đối với các tệp json lớn. Tôi muốn chuyển sang một phương pháp tiếp cận trực tuyến nhưng không thể tìm ra cách sử dụng một FileInputStream với RestTemplate đúng cách. Tôi tìm thấy this question và sử dụng mã được đưa ra trong câu trả lời được chấp nhận nhưng tôi vẫn thấy việc sử dụng bộ nhớ và các ngoại lệ của OutOfMemory khiến tôi tin rằng nó không phát trực tuyến các tệp nhưng vẫn đọc chúng hoàn toàn vào bộ nhớ. Tôi đang làm gì sai? Dưới đây là những gì tôi hiện có:POST InputStream với RestTemplate
final InputStream fis = ApplicationStore.class.getResourceAsStream(path);
final RequestCallback requestCallback = new RequestCallback() {
@Override
public void doWithRequest(final ClientHttpRequest request) throws IOException {
request.getHeaders().add("Content-type", "application/json");
IOUtils.copy(fis, request.getBody());
}
};
final RestTemplate restTemplate = new RestTemplate();
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setBufferRequestBody(false);
restTemplate.setRequestFactory(requestFactory);
final HttpMessageConverterExtractor<String> responseExtractor =
new HttpMessageConverterExtractor<String>(String.class, restTemplate.getMessageConverters());
restTemplate.execute("http://" + host + ":8080/upads-data-fabric" + "/ruleset", httpMethod, requestCallback, responseExtractor);
Hmm ... nó vẫn có vẻ là đọc các tệp vào bộ nhớ và tôi kết thúc với một ngoại lệ OutOfMemory ngay. Tui bỏ lỡ điều gì vậy? Đây là những gì tôi đã làm http://pastebin.com/ytjHDjR1 – Tom
Và cấu hình RestTemplate của tôi ở đây http://pastebin.com/6Rf2x6i3 – Tom
@Tom Có phải vấn đề của bạn với việc viết nội dung yêu cầu hoặc đọc nội dung phản hồi không? Tôi đã trả lời yêu cầu. Mã nguồn của 'ResourceHttpMessageConverter' là [ở đây] (https://github.com/spring-projects/spring-framework/blob/master/spring-web/src/main/java/org/springframework/http/converter/ ResourceHttpMessageConverter.java # L102). Bạn sẽ nhận thấy nó sử dụng 'StreamUtils # copy', sử dụng bộ đệm 4096 byte. –