SpringBoot 3 RestTemplate set readtimeout or responsetimeout per each request

74 Views Asked by At

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

  1. 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 + "]";
        }
        
        
        

        
      }
    }
  1. 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;
    }
0

There are 0 best solutions below