Java RestTemplate——默认超时值

Java RestTemplate——默认超时值,java,web-services,spring,http,rest,Java,Web Services,Spring,Http,Rest,使用Spring的RestTemplate时,默认超时值是多少 例如,我调用的web服务如下: RestTemplate restTemplate = new RestTemplate(); String response = restTemplate.getForObject("http://webservice.com/item/3455", String.class); public class MyRestTemplate extends RestTemplate { publ

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

例如,我调用的web服务如下:

RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject("http://webservice.com/item/3455", String.class);
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);
        }
    }
}

restemplate
是否有内置超时值?我不打算更改超时值,但是,我希望确保每个请求都有一个合理的超时。

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


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

spring android RestTemplate的一个不错的功能是根据操作系统的版本使用适当的(谷歌推荐的)RequestFactory实现

谷歌建议在姜饼上使用J2SE工具(版本 2.3)和更新版本,而以前的版本应使用HttpComponents HttpClient。基于此建议,RestTemplate将检查 运行应用程序并使用 合适的客户前传工厂

因此,前面的答案并不完整,因为没有考虑HttpComponentClientHttpRequestFactory(SpringAndroid在android操作系统版本<2.3时使用)

我的解决方案是这样的:

RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject("http://webservice.com/item/3455", String.class);
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);
        }
    }
}

要明确回答这个问题

默认超时是无限的

默认情况下,RestTemplate使用SimpleClientHttpRequestFactory,而这反过来又使用HttpURLConnection

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

-Dsun.net.client.defaultConnectTimeout=TimeoutInMiliSec 
-Dsun.net.client.defaultReadTimeout=TimeoutInMiliSec 

您可以在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;
}
当您需要新的RestTemplate时,请按照以下示例创建它:

RestTemplate rt = new RestTemplate(getClientHttpRequestFactory());

谢谢我查看了SimpleClientHttpRequestFactory的文档,其中提到“默认超时是系统的默认超时”。这意味着什么?我已经看过SimpleClientHttpRequestFactory的源代码,读取和连接超时的默认值都是-1。我认为默认值他们的意思是,由于HTTP依赖于URLConnection,它将依赖于jdk进行默认超时设置URLConnection的默认超时是无限的。这是否意味着RestTemplate也有一个无限超时值?是的,默认情况下,请查看。您可以使用系统属性设置系统超时代码!如何设置rest调用的超时消息?因为我想在请求为timedout且没有结果且服务器端没有错误时显示一些消息执行请求时,捕获SocketTimeoutException或类似的smth-并显示超时消息。感谢您的评论!)我正在处理太多的rest调用,我正在使用android注释在RestService接口中梳理这些调用。所有这些rest调用都抛出RestClientException。但是,当我添加IOException时,SocketTimeoutException就出现了,它要求我在进行其余调用的任何地方处理它。是否在每次rest调用中都不进行更改就可以处理此问题?我在这里发布了我的问题:是否有一个api来查询当前设置的值?我可以看到HttpComponentClientHttpRequestFactory上的setter来设置值,但是没有相应的getter来直接查询值?这是唯一对我有效的方法。我试图通过API为HttpComponentClientHttpRequestFactory设置超时,但没有成功。我必须将上述值作为运行时参数传递(SpringBoot-2.1.5)