Ho un client che deve inviare un numero elevato di file json di grandi dimensioni a un server. Sono stato in grado di farlo funzionare leggendo ciascuno dei file in memoria e pubblicando l'intero file con RestTemplate. Tuttavia, il client esaurisce rapidamente la memoria occupandosi dei file json di grandi dimensioni. Voglio passare a un approccio di streaming ma non riesco a capire come utilizzare correttamente un fileInputStream con RestTemplate. Ho trovato this question e ho usato il codice dato nella risposta accettata, ma sto ancora vedendo l'utilizzo della memoria e le eccezioni OutOfMemory che mi portano a credere che non stia trasmettendo i file ma li stia comunque leggendo interamente in memoria. Che cosa sto facendo di sbagliato? Ecco cosa ho attualmente:InputStream POST con 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 ... sembra ancora che stia leggendo i file in memoria e finisco con un'eccezione OutOfMemory a breve. Mi sto perdendo qualcosa? Ecco cosa ho fatto http://pastebin.com/ytjHDjR1 – Tom
E la mia configurazione di RestTemplate è qui http://pastebin.com/6Rf2x6i3 – Tom
@Tom Il tuo problema è scrivere il corpo della richiesta o leggere il corpo della risposta? Stavo rispondendo per la richiesta. Il codice sorgente di 'ResourceHttpMessageConverter' è [qui] (https://github.com/spring-projects/spring-framework/blob/master/spring-web/src/main/java/org/springframework/http/converter/ ResourceHttpMessageConverter.java # L102). Noterete che usa 'StreamUtils # copy' che usa un buffer di 4096 byte. –