Spring Boot Application - what is default timeout for any rest API endpoint or a easy config to control all endpoint timeout

75,395

Solution 1

I agree all above options and tried below option in my spring boot application. It works perfectly fine now. Below is the code sample as a bean. Now just need to @Autowire RestTemplate wherever(java class) I need it.

   @Bean
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate();
        ((SimpleClientHttpRequestFactory) restTemplate.getRequestFactory()).setConnectTimeout(15000);
        ((SimpleClientHttpRequestFactory) restTemplate.getRequestFactory()).setReadTimeout(15000);

        return restTemplate;
    }

Solution 2

You can try server.connection-timeout=5000 in your application.properties.From the official documentation:

server.connection-timeout= # Time in milliseconds that connectors will wait for another HTTP request before closing the connection. When not set, the connector's container-specific default will be used. Use a value of -1 to indicate no (i.e. infinite) timeout.

UPDATE: Just noticed that you use microservice architecture, so in case you need to handle timeouts when communicating between microservices, I would suggest handling it on the client side instead of the server side. If the microservice you are trying to call is overloaded and its performance degrades to the point where it drastically affects the user experience sometimes it's better to return some fallback data than just drop the request.

Imagine we have an e-commerce web-site that has microservice architecture and one of its microservices that gives recommendations to the user becomes extremely slow. In this case, the preferred solution would be to return some fallback data which could be top 10 popular products this month rather than showing 5xx error page to the customer. Moreover, in case subsequent requests fail with a timeout, we can make a decision to avoid sending requests to the 'recommendation-service' and return fallback data immediately. After some time we can try sending a request to the 'recommendation-service' again, and if it became healthy - just use it instead of the fallback data.

This is called Circuit Breaker pattern and there is already an implementation of it in a framework called Hystrix. Here is a nice article explaining it in depth: http://www.baeldung.com/spring-cloud-netflix-hystrix. Spring Cloud Feign + Spring Cloud Hystrix looks really nice especially taking into account that they work with Discovery services out-of-the-box (e.g. Spring Cloud Eureka).

Solution 3

There are a couple of ways to do this:

1) Using ClientHttpRequestFactory with RestTemplate:

public RestTemplate restTemplate() {
    return new RestTemplate(clientHttpRequestFactory());
}

private ClientHttpRequestFactory clientHttpRequestFactory() {
    HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
    factory.setReadTimeout(timeinMillis);
    factory.setConnectTimeout(timeinMillis);
    return factory;
}

2) Second way is to use callable but I guess you have already explored that solution.

Solution 4

The timeout can be set using the connectionTimeout property of Tomcat.

Please refer this answer how to set it for Tomcat.

Configuring maxKeepAliveRequests in Spring Boot embedded Tomcat

Share:
75,395
Gunjan Kumar
Author by

Gunjan Kumar

Software Engineering Manager and Mentor.

Updated on March 18, 2021

Comments

  • Gunjan Kumar
    Gunjan Kumar about 3 years

    I am using current Spring boot version (1.4.x) and wondering if it has any default timeout for api calls. I have tested it by putting breakpoints but it was keep waiting and didn't time-out. I was also trying to configure default timeout for all my spring-boot apps by using some annotation or yml settings.

    I found couple of alternatives (one of them here) but using callable actually adding extra non-business logic code where setting something in xml bean is out of fashion in latest spring boot applications.

  • Shaohua Huang
    Shaohua Huang over 5 years
    What is the default value of server.connection-timeout?
  • deldev
    deldev about 5 years
    What is "fallback data"?
  • Danylo Zatorsky
    Danylo Zatorsky about 5 years
    For instance if you have an Amazon online store and you want to show recommendations for a user, but recommendation service is under a heavy load and responding very slowly. You can return fallback data immediately if such a scenario occurs. In this case, you can return top 100 the most popular items instead of waiting for recommendation serviceto respond. Circuit Breaker pattern is all about this idea.
  • geliba187
    geliba187 over 4 years
    I think the answer is just wrong, server.connection-timeout is basically idle connection timeout.