У меня есть клиент, которому необходимо ПОСТ на большое количество больших 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);
Хмм ... он все еще, кажется, читает файлы в памяти, и в итоге я получаю исключение OutOfMemory. Я что-то упускаю? Вот что я сделал http://pastebin.com/ytjHDjR1 – Tom
И моя конфигурация RestTemplate находится здесь http://pastebin.com/6Rf2x6i3 – Tom
@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 байт. –