3
votes

I have a springboot rest Service A calling rest service B using restTemplate. Rest service A's restTemplate bean is created as follows with timeout settings as seen in the code snippet below.

@Bean
RestTemplate getRestTemplate()
{
    CloseableHttpClient  closeableHttpClient = HttpClientBuilder.create().build();
    HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(closeableHttpClient);
    RestTemplate restTemplate = new RestTemplate(requestFactory);

    requestFactory.setConnectTimeout( 2000 );
    requestFactory.setReadTimeout( 2000 );

    return restTemplate;
}

A calls B as follows:

try{
    restTemplate.postForEntity(urlSvcB, httpEntity, myObject.class);
}
catch (Exception ex){
  .....some code here.....
}

When I put both A and B in bebug mode and wait at a breakpoint in B for more than 2 seconds, I except restTemplate call in A to detect a timeout of 2 seconds and straight away go in to the exception block BUT it doesn't. I also put a thread.sleep(5000) in B but still in vain.

Is there anything wrong I am doing because of which I don't see the expected ?

1
Hi, did you know the reason for this? I'm facing the sameKyle

1 Answers

1
votes

If you are using spring boot, then you could try:

@Bean
public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) 
{
    return restTemplateBuilder
       .setConnectTimeout(...)
       .setReadTimeout(...)
       .build();
}

If that is not okay, then in your current code, try setting all the props on requestFactory before creating a restTemplate OR test once by getting rid of CloseableHTTPClient like:

HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
httpRequestFactory.setConnectionRequestTimeout(...);
httpRequestFactory.setConnectTimeout(...);
httpRequestFactory.setReadTimeout(...);
return new RestTemplate(httpRequestFactory);