欢迎来到代码驿站!

JAVA代码

当前位置:首页 > 软件编程 > JAVA代码

Resttemplate中设置超时时长方式

时间:2022-08-01 10:47:23|栏目:JAVA代码|点击:

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

上一篇:SpringBoot集成ElasticSearch的示例代码

栏    目:JAVA代码

下一篇:Java8 如何移除两个相同的List对象

本文标题:Resttemplate中设置超时时长方式

本文地址:http://www.codeinn.net/misctech/209518.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有