RestTemplate - 默认超时值

sar*_*_pc 28 java rest spring web-services http

使用Spring的RestTemplate时,默认超时值是多少?

例如,我正在调用这样的Web服务:

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

RestTemplate是否有内置的超时值?我不打算更改超时值,但是,我想确保每个请求都有合理的超时.

谢谢.

Jig*_*ekh 19

我认为您可以使用SimpleClientHttpRequestFactory作为超时参数.可以通过构造函数或setter方法将SimpleClientHttpRequestFactory的实例设置为rest模板.

默认情况下,RestTemplate使用SimpleClientHttpRequestFactory,因此您可以直接将值设置为restTemplate.

  • 是的,默认情况下,看看[链接](http://blog.technogemsinc.com/2010/08/java-url-connection-timeout-default.html).您可以使用系统属性设置系统超时 (4认同)
  • 我查看了 SimpleClientHttpRequestFactory 的源代码,读取和连接超时的默认值为 -1。我认为它们的默认含义是因为 HTTP 依赖于 URLConnection,它将依赖于 jdk 进行默认超时设置 (2认同)

nev*_*ter 16

明确回答这个问题......

默认超时是无限的.

默认情况下,RestTemplate使用SimpleClientHttpRequestFactory,然后使用HttpURLConnection.

默认情况下,HttpURLConnection的超时为0 - 即无限,除非它已由这些属性设置:

-Dsun.net.client.defaultConnectTimeout=TimeoutInMiliSec 
-Dsun.net.client.defaultReadTimeout=TimeoutInMiliSec 
Run Code Online (Sandbox Code Playgroud)


aga*_*mov 12

spring-android RestTemplate的一个很好的功能是使用适当的(由Google推荐)RequestFactory实现,具体取决于操作系统的版本.

Google建议在Gingerbread(版本2.3)及更新版本上使用J2SE工具,而以前的版本应使用HttpComponents HttpClient.根据此建议,RestTemplate会检查运行您的应用程序的Android版本,并使用相应的ClientHttpRequestFactory.

所以之前的答案并不完整,因为没有考虑HttpComponentsClientHttpRequestFactory(由spring-android用于Android OS版本<2.3).

我的解决方案是这样的:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Car*_*sta 5

您可以在 RestTemplate 构造函数中使用 ClientHttpRequestFactory 参数:

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;
}
Run Code Online (Sandbox Code Playgroud)

当你需要一个新的 RestTemplate 时,像这个例子一样创建它:

RestTemplate rt = new RestTemplate(getClientHttpRequestFactory());
Run Code Online (Sandbox Code Playgroud)