patternjavaMinor
Using RestTemplate for HTTP request timeout
Viewed 0 times
requesttimeouthttpforusingresttemplate
Problem
I am using
(I came up with this after reading this.)
Is this an efficient way of using
I am not sure what is the right way of using
RestTemplate to make an HTTP call to one of my service and I would like to have timeout for my HTTP Request:public static String getResponse(final String url) {
RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory());
String response = restTemplate.getForObject(url, String.class);
// return response
}
private ClientHttpRequestFactory clientHttpRequestFactory() {
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
factory.setReadTimeout(2000);
factory.setConnectTimeout(2000);
return factory;
}(I came up with this after reading this.)
Is this an efficient way of using
RestTemplate along with ClientHttpRequestFactory? Since with this for each call, it will make a new RestTemplate object. Earlier, I was not using any timeout for RestTemplate so I declared RestTemplate as static final.private static final RestTemplate restTemplate = new RestTemplate();
public static String getResponse(final String url) {
String response = restTemplate.getForObject(url, String.class);
// return response
}I am not sure what is the right way of using
RestTemplate along with ClientHttpRequestFactory. Should they both be declared as static?Solution
In the example you linked,
Beans are (normally) singletons in Spring, intended for reuse. This related post also confirms that
It would be best to configure
RestTemplate is annotated with @Bean:@Bean
public RestTemplate restTemplate() {
return new RestTemplate(clientHttpRequestFactory());
}Beans are (normally) singletons in Spring, intended for reuse. This related post also confirms that
RestTemplate is thread-safe, and it would be wasteful to recreate it every time.It would be best to configure
RestTemplate as in the linked article, and inject into your setup using Spring's annotations based configuration. Or, you could make it a private final member of your class.class RequestHandler {
private final RestTemplate restTemplate;
public RequestHandler() {
restTemplate = new RestTemplate(clientHttpRequestFactory());
}
public RestTemplate getRestTemplate() {
return restTemplate;
}
}Code Snippets
@Bean
public RestTemplate restTemplate() {
return new RestTemplate(clientHttpRequestFactory());
}class RequestHandler {
private final RestTemplate restTemplate;
public RequestHandler() {
restTemplate = new RestTemplate(clientHttpRequestFactory());
}
public RestTemplate getRestTemplate() {
return restTemplate;
}
}Context
StackExchange Code Review Q#62108, answer score: 4
Revisions (0)
No revisions yet.