2015-12-02 19 views
5

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

risposta

7

no. Utilizzare un Resource in combinazione con un metodo RestTemplate#exchange appropriato.

Creare uno HttpEntity con lo come body. C'è ClassPathResource per rappresentare le risorse del percorso di classe. Il RestTemplate, per impostazione predefinita, registra uno ResourceHttpMessageConverter quali flussi.

+1

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

+1

E la mia configurazione di RestTemplate è qui http://pastebin.com/6Rf2x6i3 – Tom

+0

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

Problemi correlati