添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

What is the default timeout value when using Spring's RestTemplate ?

For e.g., I am invoking a web service like this:

RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject("http://webservice.com/item/3455", String.class);

Is there any built-in timeout value for RestTemplate? I am not planning to change the timeout value, however, I want to ensure that there is a reasonable timeout for every request.

The default timeout is infinite.

By default RestTemplate uses SimpleClientHttpRequestFactory and that in turn uses HttpURLConnection.

By default the timeout for HttpURLConnection is 0 - ie infinite, unless it has been set by these properties :

-Dsun.net.client.defaultConnectTimeout=TimeoutInMiliSec 
-Dsun.net.client.defaultReadTimeout=TimeoutInMiliSec 
                Is there an api to query the currently set values? I can see the setters on HttpComponentsClientHttpRequestFactory to set the values, but there's no corresponding getters to query the values directly?
– Kevin Hooke
                Nov 1, 2017 at 17:33
                This is the only thing which worked for me. I tried to set the timeout via API for HttpComponentsClientHttpRequestFactory but didn't work. I had to pass the above values as runtime parameters (Spring Boot - 2.1.5)
– hashcoder
                May 30, 2021 at 20:33

I think you can use SimpleClientHttpRequestFactory for timeout parameter. Instance of SimpleClientHttpRequestFactory can be set to rest template by constructor or setter method.

By default RestTemplate uses SimpleClientHttpRequestFactory so may be you can directly set value to restTemplate.

thanks. I checked the documentation of SimpleClientHttpRequestFactory and it mentions that "the default timeout is the system's default timeout". What does that mean ? – saravana_pc Jul 18, 2012 at 9:40 i have looked at source code for SimpleClientHttpRequestFactory default value is -1 for both read and connect timeout. i think default they meant by as HTTP is dependent on URLConnection it will depend on jdk for default timeout setting – Jigar Parekh Jul 18, 2012 at 9:51 The default timeout for URLConnection is infinite. Does that mean RestTemplate also has an infinite timeout value? – saravana_pc Jul 18, 2012 at 10:12

One of the nice features of spring-android RestTemplate is the use of appropriate (recommended by Google) implementation of RequestFactory depending on the version of OS.

Google recommends to use the J2SE facilities on Gingerbread (Version 2.3) and newer, while previous versions should use the HttpComponents HttpClient. Based on this recommendation RestTemplate checks the version of Android on which your app is running and uses the appropriate ClientHttpRequestFactory.

So the previous answer is not full because HttpComponentsClientHttpRequestFactory (which is used by spring-android for Android OS versions < 2.3) is not taken into consideration.

My solution was something like this:

public class MyRestTemplate extends RestTemplate {
    public MyRestTemplate() {
        if (getRequestFactory() instanceof SimpleClientHttpRequestFactory) {
            Log.d("HTTP", "HttpUrlConnection is used");
            ((SimpleClientHttpRequestFactory) getRequestFactory()).setConnectTimeout(10 * 1000);
            ((SimpleClientHttpRequestFactory) getRequestFactory()).setReadTimeout(10 * 1000);
        } else if (getRequestFactory() instanceof HttpComponentsClientHttpRequestFactory) {
            Log.d("HTTP", "HttpClient is used");
            ((HttpComponentsClientHttpRequestFactory) getRequestFactory()).setReadTimeout(10 * 1000);
            ((HttpComponentsClientHttpRequestFactory) getRequestFactory()).setConnectTimeout(10 * 1000);
                Thanks for the code! How can we set a timeout message for the rest calls? Because I want to display some message when the requests is timedout with no result and no error from the server side
– Aswathy P Krishnan
                May 14, 2013 at 9:55
                when you perform the request, catch the SocketTimeoutException, or smth similar - and show your timeout message.
– agamov
                May 16, 2013 at 15:12
                Thanks for the comment! :) I am handling too many rest calls which I am combing in a RestService interface using android annotations. All those rest calls throws RestClientException. But when I added IOException under which comes SocketTimeoutException, it is asking me to handle it everywhere the rest calls are made. Is there anyway to handle this without making change in each rest call? I have posted my Q: over here :  stackoverflow.com/q/16542892/1237656
– Aswathy P Krishnan
                May 17, 2013 at 5:37

You can use ClientHttpRequestFactory param in the RestTemplate constructor:

private final int HTTP_CONNECT_TIMEOUT = 15000;
private final int HTTP_READ_TIMEOUT = 10000;
private ClientHttpRequestFactory getClientHttpRequestFactory() {
    HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();
    clientHttpRequestFactory.setConnectTimeout(HTTP_CONNECT_TIMEOUT);
    clientHttpRequestFactory.setReadTimeout(HTTP_READ_TIMEOUT);
    return clientHttpRequestFactory;

When you need a new RestTemplate, create it like this example:

RestTemplate rt = new RestTemplate(getClientHttpRequestFactory());
        

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.