2013-04-11 2 views
1

Мы используем RestEasy Client версии 3.0 *.
Мы пытаемся опубликовать очень большой контент в теле запроса.
Когда длина содержимого меньше 1 МБ, следующий код работает правильно.
Когда длина содержимого очень велика (около 500 МБ), запрос застревает.
код выглядит так:RestEasy Client 3.0. * Обработка большого содержимого

InputStream inputStream = new FileInputStream(tempFile); 
ResteasyClient client = new ResteasyClientBuilder().build(); 
ResteasyWebTarget target = client.target("<SomeUrl>"); 
response = target.request(MediaType.WILDCARD).post(Entity.entity(inputStream, MediaType.WILDCARD)); 

Как я должен изменить код для поддержки большого содержания?

Через неделю ...
Поскольку никто не ответил мне - я использовал старый добрый Весеннее решение (см. Ниже)
Весна лучше, чем клиент RestEasy?

InputStream inputStream = new FileInputStream(tempFile); 
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); 
factory.setBufferRequestBody(false); 
RestTemplate r = new RestTemplate(factory); 

RequestCallback requestCallback = new RequestCallback() { 
    @Override 
    public void doWithRequest(ClientHttpRequest clientHttpRequest) throws IOException { 
     List<org.springframework.http.MediaType> MEDIA_TYPES = Collections.unmodifiableList(Arrays.asList(org.springframework.http.MediaType.ALL)); 
     clientHttpRequest.getHeaders().setAccept(MEDIA_TYPES); 
     OutputStream requestOutputStream = clientHttpRequest.getBody(); 
     try { 
      int copiedBytes = IOUtils.copy(inputStream, requestOutputStream); 
     } finally { 
      IOUtils.closeQuietly(requestOutputStream); 
     } 
     } 
}; 

ResponseExtractor<Response> responseExtractor = new ResponseExtractor<Response>() { 
    @Override 
    public Response extractData(ClientHttpResponse response) throws IOException { 
     return Response.status(response.getRawStatusCode()).build(); 
    } 
}; 

response = r.execute(url, HttpMethod.POST, requestCallback, responseExtractor); 
+0

У меня такой же вопрос ... – wikier

ответ

0

Я думаю, весной 4.0.1 вы можете использовать Apache HTTP-клиент и HttpComponentsClientHttpRequestFactory вместо SimpleClientHttpRequestFactory. Вот оригинальное примечание: SPR-10728

<bean id="restTemplateStreaming" class="org.springframework.web.client.RestTemplate"> 
    <constructor-arg> 
     <bean class="org.springframework.http.client.HttpComponentsClientHttpRequestFactory"> 
      <property name="bufferRequestBody" value="false" /> 
      <property name="httpClient"> 
       <bean class="com.spotfire.server.http.spring.HttpClientFactory"> 
        <property name="clientBuilder"> 
         <bean class="org.apache.http.impl.client.HttpClientBuilder"> 
          <property name="connectionManager" ref="poolingHttpClientConnectionManager" /> 
          <property name="redirectStrategy"> 
           <bean class="org.apache.http.impl.client.LaxRedirectStrategy" /> 
          </property> 
         </bean> 
        </property> 
       </bean> 
      </property> 
     </bean> 
    </constructor-arg>  
</bean> 

Обратите внимание на Однако реализация обратного вызова также изменяется. Вы больше не можете вызывать clientHttpRequest.getBody(); Вместо этого вы должны использовать немного запутанную структуру, как показано ниже:

class StreamingRequestCallback implements RequestCallback { 

private final InputStream inputStream; 

StreamingRequestCallback(InputStream inputStream) { 
    this.inputStream = inputStream; 
} 

@Override 
public void doWithRequest(final ClientHttpRequest request) throws IOException { 
    request.getHeaders().add("Content-type", MediaType.APPLICATION_OCTET_STREAM_VALUE); 

    ((StreamingHttpOutputMessage) request).setBody(new StreamingHttpOutputMessage.Body() { 
    @Override 
    public void writeTo(final OutputStream outputStream) throws IOException { 
     IOUtils.copy(inputStream, outputStream); 
    } 
    }); 
} 

};

Смежные вопросы