2015-12-02 13 views
5

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); 

Trả lời

7

Không. Sử dụng một số Resource kết hợp với phương thức thích hợp RestTemplate#exchange.

Tạo HttpEntity bằng Resource làm body. Có ClassPathResource để trình bày tài nguyên đường dẫn lớp. Theo mặc định, RestTemplate, đăng ký ResourceHttpMessageConverter luồng nào.

+1

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

+1

Và cấu hình RestTemplate của tôi ở đây http://pastebin.com/6Rf2x6i3 – Tom

+0

@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. –

Các vấn đề liên quan