Springboot RestTemplate设置超时时间的简单方法

RestTemplate未设置超时时间,导致RabbitMQ队列大量堆积,消费者假死,不进行消费,类似线程堵塞。

排查:

从日志排查问题,在从进入消费者到结束期间,会调用业务服务,然而通过开始时间至结束时间,花费的时间竟然高达100多秒,查看业务服务未发现异常。出现这种问题的原因也有可能在消费期间网络波动导致HTTP连接出现问题,一直处于等待状态。由此判断可能是HTTP超时时间未设置导致的问题。

本文生产环境Springboot版本 2.1.5.RELEASE,采用的是Java config配置

Java Config配置

@Configuration
public class RestTemplateConfig {
    @Bean
    public RestTemplate getRestTemplate() {
        //配置HTTP超时时间
        HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
        httpRequestFactory.setConnectionRequestTimeout(6000);
        httpRequestFactory.setConnectTimeout(6000);
        httpRequestFactory.setReadTimeout(6000);
        return new RestTemplate(httpRequestFactory);
    }
}

配置文件指定

custom.rest.connection.connection-request-timeout=3000
custom.rest.connection.connect-timeout=3000
custom.rest.connection.read-timeout=3000
@Configuration
public class AppConfig{
    @Bean
    @ConfigurationProperties(prefix = "custom.rest.connection")
    public HttpComponentsClientHttpRequestFactory customHttpRequestFactory() {
        return new HttpComponentsClientHttpRequestFactory();
    }
​​​​​​​    @Bean
    public RestTemplate customRestTemplate(){
        return new RestTemplate(customHttpRequestFactory());
    }
}

重新部署后消费者迅速开始消费,堆积的消息已经消费完。

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);
        }
1. 本站所有资源来源于用户分享和网络转载,如有侵权请联系站长删除!
2. 分享目的仅供大家学习参考,源码类您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!

917资源网 » Springboot RestTemplate设置超时时间的简单方法

发表评论

提供最优质的资源集合

立即查看 了解详情