Single RestTemplate Bean which is initialized with default connection timeout properties.
But if you need custom timeout or specific readtimeout , you can update the RequestFactory of the Resttemplate
Try implementing HttpComponentClientRequestFactory which will replace default SimpleclientRequestFactory
- create your custom class
import org.apache.hc.client5.http.config.RequestConfig;
import org.apache.hc.client5.http.protocol.HttpClientContext;
import org.apache.hc.core5.http.protocol.HttpContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpMethod;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
public class MyHttpCompClientHttpReqFactory extends HttpComponentsClientHttpRequestFactory {
private static final Logger log = LoggerFactory.getLogger(MyHttpCompClientHttpReqFactory.class);
private CustomRequestProps customRequestProps =null;
@SuppressWarnings("deprecation")
protected HttpContext createHttpContext(HttpMethod httpMethod, URI uri) {
if(customRequestProps!=null) {
HttpClientContext context = HttpClientContext.create();
RequestConfig requestConfig = createRequestConfig(getHttpClient()); // Get default request config and modify timeouts as specified
long defaultResponseTimeout=requestConfig.getResponseTimeout().toMilliseconds();
RequestConfig customReqConfig = RequestConfig.copy(requestConfig)
.setResponseTimeout(customRequestProps.getResponseTimeoutMillis(),TimeUnit.MILLISECONDS)
.setConnectTimeout(customRequestProps.getConnectionTimeoutMillis(),TimeUnit.MILLISECONDS)
.setConnectionRequestTimeout(customRequestProps.getConnectionRequestTimeoutMillis(),TimeUnit.MILLISECONDS)
.build();
context.setAttribute(HttpClientContext.REQUEST_CONFIG, customReqConfig);
long customResponseTimeout=requestConfig.getResponseTimeout().toMilliseconds();
log.info("MyHttpCompClientHttpReqFactory defaultResponseTimeout "+defaultResponseTimeout+" customResponseTimeout "+customResponseTimeout);
return context;
}
return null;// continue with actual method in HttpComponentsClientHttpRequestFactory
}
protected CustomRequestProps initCustomRequestConfigProps(int connectionTimeoutMillis,
int connectionRequestTimeoutMillis,
int responseTimeoutMillis) {
this.customRequestProps=new CustomRequestProps(connectionTimeoutMillis,
connectionRequestTimeoutMillis,
responseTimeoutMillis);
return customRequestProps;
}
private class CustomRequestProps {
int connectionTimeoutMillis;
int connectionRequestTimeoutMillis;
int responseTimeoutMillis;
CustomRequestProps(int connectionTimeoutMillis,
int connectionRequestTimeoutMillis,
int responseTimeoutMillis){
this.connectionTimeoutMillis=connectionTimeoutMillis;
this.connectionRequestTimeoutMillis=connectionRequestTimeoutMillis;
this.responseTimeoutMillis=responseTimeoutMillis;
}
public int getConnectionTimeoutMillis() {
return connectionTimeoutMillis;
}
public int getConnectionRequestTimeoutMillis() {
return connectionRequestTimeoutMillis;
}
public int getResponseTimeoutMillis() {
return responseTimeoutMillis;
}
@Override
public String toString() {
return "CustomRequestProps [connectionTimeoutMillis=" + connectionTimeoutMillis
+ ", connectionRequestTimeoutMillis=" + connectionRequestTimeoutMillis + ", responseTimeoutMillis="
+ responseTimeoutMillis + "]";
}
}
}
- invoke custom class
yourImplclass.java
@Autowired
RestTemplate restTemplate;
public invokeApi(String requestBody){
restTemplate.setRequestFactory(getRequestFactory(timeout));
HttpHeaders httpHeaders = new HttpHeaders();
HttpEntity<String> requestHttpEntity = new HttpEntity<>(requestBody, httpHeaders);
ResponseEntity<String> responseEntity = restTemplate.exchange(requestUrl, method, requestHttpEntity,new ParameterizedTypeReference<String>() {
});
}
private ClientHttpRequestFactory getRequestFactory(int inputTimeOutMillis) {
MyHttpCompClientHttpReqFactory clientHttpRequestFactory = new MyHttpCompClientHttpReqFactory ();
clientHttpRequestFactory.initCustomRequestConfigProps(10, 20, 30);
return clientHttpRequestFactory;
}