2015-12-02 1 views
5

У меня есть клиент, которому необходимо ПОСТ на большое количество больших json-файлов на сервер. Я смог заставить его работать, читая каждый из файлов в памяти и отправляя весь файл с помощью RestTemplate. Однако у клиента быстро заканчивается память, связанная с большими файлами json. Я хочу переключиться на потоковый подход, но не могу понять, как правильно использовать FileInputStream с RestTemplate. Я нашел this question и использовал код, указанный в принятом ответе, но я все еще вижу использование памяти и исключения OutOfMemory, которые заставляют меня думать, что это не потоковая передача файлов, а чтение их полностью в памяти. Что я делаю не так? Вот что у меня есть:POST InputStream с 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); 

ответ

7

Не делайте этого. Используйте Resource в сочетании с соответствующим методом RestTemplate#exchange.

Создайте HttpEntity с Resource как body. Для представления ресурсов пути класса существует ClassPathResource. RestTemplate, по умолчанию, регистрирует ResourceHttpMessageConverter, который передает потоки.

+1

Хмм ... он все еще, кажется, читает файлы в памяти, и в итоге я получаю исключение OutOfMemory. Я что-то упускаю? Вот что я сделал http://pastebin.com/ytjHDjR1 – Tom

+1

И моя конфигурация RestTemplate находится здесь http://pastebin.com/6Rf2x6i3 – Tom

+0

@Tom Это ваша проблема с написанием тела запроса или чтением тела ответа? Я отвечал на просьбу. Исходный код «ResourceHttpMessageConverter» [здесь] (https://github.com/spring-projects/spring-framework/blob/master/spring-web/src/main/java/org/springframework/http/converter/ ResourceHttpMessageConverter.java # L102). Вы заметите, что использует 'StreamUtils # copy', который использует буфер 4096 байт. –