评论

收藏

[Java] Resttemplate中设置超时时长方式

编程语言 编程语言 发布于:2022-03-07 20:15 | 阅读数:521 | 评论:0

这篇文章主要介绍了Resttemplate中设置超时时长方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
目录

  • Resttemplate 设置超时时长
  • RestTemplate 设置超时时间注意点

Resttemplate 设置超时时长
为了满足调用需求,需要在使用Resttemplate发送请求时,修改超时时长,网上给出了相关修改方法,代码如下:
HttpComponentsClientHttpRequestFactory rf =
      ((HttpComponentsClientHttpRequestFactory) restTemplate.getRequestFactory());
    rf.setConnectTimeout(30000);
    rf.setReadTimeout(30000);
但是在运行时报错:
org.springframework.http.client.InterceptingClientHttpRequestFactory cannot be cast to org.springframework.http.client.HttpComponentsClientHttpRequestFactory
restTemplate.getRequestFactory()返回的类型无法转换,通过搜索和调试发现,在resttemplate中,必须在设置拦截器之前设置超时,因为在设置拦截器后无法设置超时,而我在设置中并没有设置过拦截器,应该是被默认构造了
所以解决方法如下:
restTemplate.setInterceptors(null);
HttpComponentsClientHttpRequestFactory rf =
      ((HttpComponentsClientHttpRequestFactory) restTemplate.getRequestFactory());
rf.setConnectTimeout(30000);
rf.setReadTimeout(30000);
在设置超时之前,先将拦截器置空,这样就不会出现无法设置的问题,之后验证通过。
查看resttemplate源码后发现,之所以会出现这样的情况是因为在resttemplate的源码中,有这么一段代码:
/**
 * Return the request interceptor that this accessor uses.
 */
public List<ClientHttpRequestInterceptor> getInterceptors() {
   return interceptors;
}
@Override
  public ClientHttpRequestFactory getRequestFactory() {
    ClientHttpRequestFactory delegate = super.getRequestFactory();
    if (!CollectionUtils.isEmpty(getInterceptors())) {
      return new InterceptingClientHttpRequestFactory(delegate, getInterceptors());
    }
    else {
      return delegate;
    }
  }
可以看到,在getRequestFactory()函数中,本来应该是返回ClientHttpRequestFactory类型的,但是它会先校验一次是否含有interceptors拦截器,如果拦截器非空,则会返回包含拦截器的InterceptingClientHttpRequestFactory,这样是无法转换为HttpComponentsClientHttpRequestFactory类型的,因此在前面处理的时候将拦截器置空,这样就可以返回不含拦截器的所需对象。

RestTemplate 设置超时时间注意点
1、保证系统中只有一个RestTemplate的配置;不然可能与你的预期不一致。
2、永远不要太相信自己写的代码;多打印日志才能真正知道调用时间;
long s = System.currentTimeMillis();
    try {
      responseEntity = restTemplate.exchange();
    } catch (Exception e) {
      long costTime = System.currentTimeMillis()-s;
      log.error("调用**服务异常,花费时间:{},错误:{}",costTime, e.getMessage(), e);
    }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持CodeAE代码之家
原文链接:https://www.cnblogs.com/dbave/p/9381097.html

关注下面的标签,发现更多相似文章