Search code examples
javamultithreadingspringhttprequestresttemplate

SimpleClientHttpRequestFactory vs HttpComponentsClientHttpRequestFactory for Http Request timeout with RestTemplate?


I am working on a project in which I need to make a HTTP URL call to my server which is running Restful Service which returns back the response as a JSON String.

Below is my main code which is using the future and callables:

public class TimeoutThreadExample {

    private ExecutorService executor = Executors.newFixedThreadPool(10);
    private RestTemplate restTemplate = new RestTemplate();

    public String getData() {
        Future<String> future = executor.submit(new Task(restTemplate));
        String response = null;

        try {
            response = future.get(500, TimeUnit.MILLISECONDS);
        } catch (TimeoutException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

        return response;
    }
}

Below is my Task class which implements the Callable interface and uses the RestTemplate:

class Task implements Callable<String> {

    private RestTemplate restTemplate;

    public Task(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    public String call() throws Exception {

        String url = "some_url";
        String response = restTemplate.getForObject(url, String.class);

        return response;
    }
}

Problem Statement:

As you can see above, I am using default way of executing the URL using RestTemplate which doesn't use any Http Request timeout so that means internally it is using -1 as the read and connection timeout.

Now what I am looking to do is, I want to set up Http Request timeout using RestTemplate in my above code efficiently. And I am not sure which class I need to use for that, I can see HttpComponentsClientHttpRequestFactory and SimpleClientHttpRequestFactory so not sure which one I need to use?

Any simple example basis on my above code will help me understand better on how to set the Http Request timeout using RestTemplate.

And also does my Http Request timeout value should be less than future timeout value?

  • HttpComponentsClientHttpRequestFactory vs SimpleClientHttpRequestFactory. Which one to use?
  • Does my Http Request timeout value should be less than future timeout value?

Solution

  • By default RestTemplate uses SimpleClientHttpRequestFactory which depends on default configuration of HttpURLConnection.

    You can configure them by using below attributes:

    -Dsun.net.client.defaultConnectTimeout=TimeoutInMiliSec 
    -Dsun.net.client.defaultReadTimeout=TimeoutInMiliSec 
    

    If you want to use HttpComponentsClientHttpRequestFactory - it has a connection pooling configuration which SimpleClientHttpRequestFactory does not have.

    A sample code for using HttpComponentsClientHttpRequestFactory:

    public class TimeoutThreadExample {
    
        private ExecutorService executor = Executors.newFixedThreadPool(10);
        private static final RestTemplate restTemplate = createRestTemplate();
    
        private static RestTemplate createRestTemplate(){
           HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
           requestFactory.setReadTimeout(READ_TIME_OUT);
           requestFactory.setConnectTimeout(CONNECTION_TIME_OUT);
           return new RestTemplate(requestFactory);
         }
    
        public String getData() {
            Future<String> future = executor.submit(new Task(restTemplate));
            String response = null;
    
            try {
                response = future.get(500, TimeUnit.MILLISECONDS);
            } catch (TimeoutException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
    
            return response;
        }
    }