How to add rest API request time out in OAuth2RestTemplate in spring boot?

59 views Asked by At

In my spring boot microservices, I am using OAuth2RestTemplate to make rest API call. Now, We have to add request time out in rest api call and for that I tried spring.mvc.async.request-timeout=20000 in application.properties file but did not work.

@Configuration
public class ResourceConfig {

   @Bean
   @LoadBalanced
   @Qualifier("oauth2BalancedRestTemplate")
   public OAuth2RestTemplate oauth2BalancedRestTemplate(@Qualifier("oauth2RestTemplate") OAuth2RestTemplate bean) {
      OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(bean.getResource());
      restTemplate.setRequestFactory(bean.getRequestFactory());
      return restTemplate;
   }
   
   @Bean
   @LoadBalanced
   @Qualifier("oauth2JWTBalancedRestTemplate")
   public OAuth2RestTemplate oauth2JWTBalancedRestTemplate(@Qualifier("oauth2JWTRestTemplate") OAuth2RestTemplate bean) {
      OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(bean.getResource());
      restTemplate.setRequestFactory(bean.getRequestFactory());
      return restTemplate;
   } 
}

@Service
public class ApiCall {

   @Value("${url}")
   private String uri;
   
   @Value("${endpoint}")
   private String endpoint;
   
   @Autowired
   @Qualifier("oauth2JWTBalancedRestTemplate")
   private OAuth2RestTemplate restTemplate;

   public Response getTrdDetail(Request req) {
     HttpHeaders headers = new HttpHeaders();
     HttpEntity<Request> httpEntity = new HttpEntity<Request> (req, headers);
     return restTemplate.exchange(uri + endpoint, HttpMethod.POST, httpEntity, Response.class);
   
   }
}
1

There are 1 answers

2
Kumar Sinha On

Ensure these dependencies

<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>

Configure the HttpComponentsClientHttpRequestFactory bean and then inject it into your OAuth2RestTemplate bean:

@Configuration
public class ResourceConfig {

    @Bean
    public HttpComponentsClientHttpRequestFactory clientHttpRequestFactory() {
        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
        factory.setConnectTimeout(5000); // 5 seconds
        factory.setReadTimeout(5000);    // 5 seconds
        return factory;
    }

    @Bean
    public OAuth2RestTemplate oAuth2RestTemplate() {
        ResourceOwnerPasswordResourceDetails resourceDetails = new ResourceOwnerPasswordResourceDetails();
        resourceDetails.setAccessTokenUri("YOUR_ACCESS_TOKEN_URI");
        resourceDetails.setClientId("YOUR_CLIENT_ID");
        resourceDetails.setClientSecret("YOUR_CLIENT_SECRET");
        resourceDetails.setClientAuthenticationScheme(AuthenticationScheme.header);

        OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(resourceDetails);
        restTemplate.setRequestFactory(clientHttpRequestFactory());
        
        return restTemplate;
    }
}