当前位置: 首页 > 面试题库 >

Spring RestTemplate超时

庄萧迟
2023-03-14
问题内容

我想为我的Web应用程序使用的rest服务设置连接超时。我正在使用Spring的RestTemplate与我的服务交谈。我进行了一些研究,发现并使用了下面的xml(在我的应用程序xml中),我认为这是为了设置超时。我正在使用Spring 3.0。

我在这里也看到了同样的问题,使用RestTemplate为Spring Web服务设置超时,但是解决方案似乎不太干净,我更愿意通过Spring config设置超时值

<bean id="RestOperations" class="org.springframework.web.client.RestTemplate">
    <constructor-arg>

      <bean class="org.springframework.http.client.CommonsClientHttpRequestFactory">
        <property name="readTimeout" value="${restURL.connectionTimeout}" />
      </bean>
    </constructor-arg>
</bean>

看来无论我将readTimeout设置为什么,都会得到以下信息:

网络电缆已断开连接: 等待约20秒,并报告以下异常:

org.springframework.web.client.ResourceAccessException:I / O错误:没有通往主机的路由:connect; 嵌套的异常是java.net.NoRouteToHostException:没有路由到主机:connect

网址不正确,因此REST服务返回404: 等待大约10秒,并报告以下异常:

org.springframework.web.client.HttpClientErrorException:找不到404

我的要求需要更短的超时,因此我需要能够更改这些超时。关于我在做什么错的任何想法吗?

非常感谢。


问题答案:

我认为我们的项目具有commons-httpclient jar的两个不同版本的事实并没有帮助。整理好之后,我发现你可以做两件事…

在代码中,你可以放置​​以下内容:

HttpComponentsClientHttpRequestFactory rf =
    (HttpComponentsClientHttpRequestFactory) restTemplate.getRequestFactory();
rf.setReadTimeout(1 * 1000);
rf.setConnectTimeout(1 * 1000);

首次调用此代码时,它将设置所HttpComponentsClientHttpRequestFactory使用的类的超时RestTemplate。因此,所有随后的呼叫RestTemplate将使用上面定义的超时设置。

或更好的选择是这样做:

<bean id="RestOperations" class="org.springframework.web.client.RestTemplate">
    <constructor-arg>
        <bean class="org.springframework.http.client.HttpComponentsClientHttpRequestFactory">
            <property name="readTimeout" value="${application.urlReadTimeout}" />
            <property name="connectTimeout" value="${application.urlConnectionTimeout}" />
        </bean>
    </constructor-arg>
</bean>

我RestOperations在代码中使用接口的位置,并从属性文件中获取超时值。



 类似资料:
  • 给Rest服务打电话 http://acme.com/app/widget/123 返回: 此客户端代码的工作原理是: 但是,http://acme.com/app/widget/456返回: 但此客户端代码引发了一个异常: 我试过: 第二次调用只是抛出了另一个HttpClientErrorException,而且它觉得调用服务两次是不对的。 是否有一种方法可以调用该服务一次,并在成功时将响应解析

  • web API以,但是消息的格式就像是JSON一样,例如。 在Spring中,此消息使用RestTemplate处理,JSON自动映射到POJO, 这会产生以下错误: org.springframework.web.client.RestClientExcture:无法提取响应:没有找到适合响应类型[class api的HttpMessageConzer。ModelDto]和内容类型[文本/普通;

  • 我是全新的RestTemboard和基本上在REST API也。我想通过Jira REST API检索我的应用程序中的一些数据,但取回401未经授权。在jira rest api留档上找到并发表文章,但不知道如何将其重写为java,因为示例使用curl的命令行方式。我将感谢任何建议或建议如何重写: 进入java使用SpringRest模板。其中ZnJlZDpmcmVk是用户名:密码的Bas64编码

  • 是否可以使用SpringRESTTemplate将原始JSON传递给RESTAPI? 我正在尝试以下几点: 当我调用这个请求时,我得到一个HTTP 400错误响应,这意味着错误的请求。但是,所有标头和JSON正文都与使用我拥有的HTTP客户端提交的相同。 相比之下,当我创建MyRequest对象并在HttpEntity上设置它时,下面的工作原理很好: 因此,我想知道如何使用字符串格式的原始JSON

  • 当我们所有数据库的 SQL 语句是通过子查询方式完成,对于超时的控制往往很容易被大家忽略。因为大家在代码里看不到任何调用 set_timeout 的地方。实际上 PostgreSQL 已经为我们预留好了两个设置。 请参考下面这段配置: location /postgres { internal; default_type text/html; set_by_lua_blo

  • 你是否正遇到网络或 CPU 的瓶颈? 验证客户端和托管redis-server的服务器上支持的最大带宽。如果有请求被带宽限制,则它们需要更长时间才能完成,从而可能导致超时。 同样,验证您没有在客户端或服务器框上获得CPU限制,这将导致请求等待CPU时间,从而超时。 有没有命令需要在 redis 服务器上处理很长时间? 可能有一些命令需要很长时间才能在redis服务器上处理,导致请求超时。 长时间

  • 套房级 套件级超时可应用于整个测试“套件”,或通过其禁用this.timeout(0)。这将由所有嵌套套件和不覆盖该值的测试用例继承。 describe('a suite of tests', function() { this.timeout(500); it('should take less than 500ms', function(done){ setTimeout(done, 30

  • 我使用命令生成器在Jenkins服务器上运行单元测试。phar exec“codecept运行单元应用程序/模型”-vvv并获取以下错误: [Symfony\Component\Process\Exception\ProcessTimedOutException] 进程“codecept运行单元应用程序/模型”超过了1800秒的超时时间。 我如何修复它并允许测试花费更多的时间?谢谢