Uploaded image for project: 'Olingo'
  1. Olingo
  2. OLINGO-1622

can't reuse HTTP connections

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Open
    • Major
    • Resolution: Unresolved
    • (Java) V4 5.0.1
    • None
    • odata4-client
    • None

    Description

      We want to reuse HTTP connections but Olingo V4 library is closing the connection (and discarding it) every time we have a 200 OK response from the server.

      Here you have a test code to demonstrate the issue:

      package com.jtaphie;
      
      import java.io.InputStream;
      import java.net.URI;
      import java.nio.charset.StandardCharsets;
      import org.apache.commons.io.IOUtils;
      import org.apache.http.client.HttpClient;
      import org.apache.http.impl.client.HttpClients;
      import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
      import org.apache.olingo.client.api.ODataClient;
      import org.apache.olingo.client.api.communication.request.retrieve.ODataEntityRequest;
      import org.apache.olingo.client.api.communication.response.ODataRetrieveResponse;
      import org.apache.olingo.client.api.domain.ClientEntity;
      import org.apache.olingo.client.api.http.HttpClientFactory;
      import org.apache.olingo.client.api.http.NoContentException;
      import org.apache.olingo.client.core.ODataClientFactory;
      import org.apache.olingo.commons.api.ex.ODataRuntimeException;
      import org.apache.olingo.commons.api.http.HttpMethod;
      
      public class ReuseHttpConnectionTest {
      
        public static void main(String[] args) throws Exception {
          ReusableHttpClientFactory httpClientFactory = new ReusableHttpClientFactory();
          ODataClient client = ODataClientFactory.getClient();
          client.getConfiguration().setHttpClientFactory(httpClientFactory);
      
          ODataEntityRequest<ClientEntity> request =
              client
                  .getRetrieveRequestFactory()
                  .getEntityRequest(
                      new URI(
                          "https://services.odata.org/V4/(S(ckjlngqm5lub5c5osrvdfvbf))/TripPinServiceRW/Photos(1)"));
      
          ODataRetrieveResponse<ClientEntity> response = null;
          try {
            response = request.execute();
          } catch (ODataRuntimeException e) {
            // HTTP 404
          }
      
          if (response != null) {
            try (InputStream is = response.getRawResponse()) {
              System.out.println(IOUtils.toString(is, StandardCharsets.UTF_8));
            } catch (NoContentException e) {
              // HTTP 204
            } finally {
              response.close();
            }
          }
      
          System.out.print(httpClientFactory.connectionManager.getTotalStats());
        }
      
        private static class ReusableHttpClientFactory implements HttpClientFactory {
          private final PoolingHttpClientConnectionManager connectionManager;
          private final HttpClient httpClient;
      
          private ReusableHttpClientFactory() {
            connectionManager = new PoolingHttpClientConnectionManager();
            httpClient = HttpClients.custom().setConnectionManager(connectionManager).build();
          }
      
          @Override
          public HttpClient create(HttpMethod method, URI uri) {
            return httpClient;
          }
      
          @Override
          public void close(HttpClient httpClient) {
            // do nothing as we want to reuse the same http client instance
          }
        }
      }
      

      The output of the test should be:

      [leased: 0; pending: 0; available: 1; max: 20]
      

      But it is:

      [leased: 0; pending: 0; available: 0; max: 20]
      

      The reason is that the library closes the response instead of consuming it.

      Is it a bug or is there any other way to reuse the connections?

      Thanks,

      Jorge

      Attachments

        Issue Links

          Activity

            People

              Unassigned Unassigned
              jtaphie Jorge Tapia
              Votes:
              0 Vote for this issue
              Watchers:
              1 Start watching this issue

              Dates

                Created:
                Updated: