No Timeouts By Default!
Spring’s RestTemplate is an extremely convenient way to make REST calls to web services. But most people don’t realize initially that these calls have no timeout by default. This means no connection timeout and no data call timeout. So, potentially, your app can make a call that should take 1 second and could freeze up for a very long time if the back end is behaving badly.
Setting a Timeout
There are a lot of ways of doing this, but the best one I’ve seen recently (from this stackoverflow post) is to create the RestTemplate in an @Configuration class and then inject it into your services. That way you know the RestTemplate you are using everywhere was configured properly with your desired timeouts.
Here is a full example.
package com.company.cloudops.config; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; import java.time.Duration; @Configuration public class AppConfig { @Value("${rest.template.timeout}") private int restTemplateTimeoutMs; @Bean public RestTemplate restTemplate(RestTemplateBuilder builder) { return builder .setConnectTimeout(Duration.ofMillis(restTemplateTimeoutMs)) .setReadTimeout(Duration.ofMillis(restTemplateTimeoutMs)) .build(); } }
To use this RestTemplate in another Spring bean class, just pull it in with:
@Autowired private RestTemplate template;