【问题标题】:RestTemplate -- default timeout valueRestTemplate -- 默认超时值
【发布时间】:2012-07-17 06:22:02
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java web-services spring http rest


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。我检查了 SimpleClientHttpRequestFactory 的文档,它提到“默认超时是系统的默认超时”。这是什么意思?
    • 我查看了 SimpleClientHttpRequestFactory 的源代码,读取和连接超时的默认值为 -1。我认为默认他们的意思是 HTTP 依赖于 URLConnection 它将依赖于 jdk 的默认超时设置
    • URLConnection 的默认超时是无限的。这是否意味着 RestTemplate 也有无限的超时值?
    • 默认情况下是的,看看link。您可以使用系统属性设置系统超时
    【解决方案2】:

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

    Google 建议在 Gingerbread 上使用 J2SE 工具(版本 2.3) 和更新的版本,而以前的版本应该使用 HttpComponents HttpClient。基于此建议 RestTemplate 检查 运行您的应用并使用 合适的 ClientHttpRequestFactory。

    所以前面的答案不完整,因为没有考虑到 HttpComponentsClientHttpRequestFactory(spring-android 用于 Android OS 版本

    我的解决方案是这样的:

    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);
            }
        }
    }
    

    【讨论】:

    • 感谢代码!我们如何为其余调用设置超时消息?因为我想在请求超时且服务器端没有结果且没有错误时显示一些消息
    • 当您执行请求时,捕获 SocketTimeoutException 或类似的 - 并显示您的超时消息。
    • 感谢您的评论! :) 我正在处理太多的休息调用,我正在使用 android 注释在 RestService interface 中进行组合。所有这些休息调用都会引发 RestClientException。但是当我添加 IOException 时,它会出现 SocketTimeoutException,它要求我在进行其余调用的任何地方处理它。有没有办法在不改变每个休息电话的情况下处理这个问题?我已经发布了我的问题:在这里:stackoverflow.com/q/16542892/1237656
    【解决方案3】:

    明确回答问题...

    默认超时是无限的。

    默认情况下,RestTemplate 使用 SimpleClientHttpRequestFactory,而后者又使用 HttpURLConnection。

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

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

    【讨论】:

    • 是否有api可以查询当前设置的值?我可以看到 HttpComponentsClientHttpRequestFactory 上的 setter 来设置值,但是没有对应的 getter 可以直接查询值?
    • 这是唯一对我有用的东西。我尝试通过 API 为 HttpComponentsClientHttpRequestFactory 设置超时,但没有奏效。我必须将上述值作为运行时参数传递(Spring Boot - 2.1.5)
    【解决方案4】:

    您可以在 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());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-25
      • 2012-05-05
      • 2021-01-24
      • 1970-01-01
      • 1970-01-01
      • 2013-12-12
      • 2019-07-29
      • 2011-01-31
      相关资源
      最近更新 更多