java中http请求之restTemplate配置超时时间问题解决

 更新时间:2023年05月31日 10:31:28   作者:oh my gald  
这篇文章主要介绍了java中http请求之restTemplate配置超时时间,本文给大家分享三种解决方法,结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

问题:http请求发起后接收不到返回数据!!!【测试环境没出问题,发到正式环境就有问题】

项目中通过restTemplate发起请求:

        log.info("请求入参:{}",JSON.toJSONString(request));//打印日志1
        // 配置http请求的连接超时时间和读取超时时间
        HttpsClientRequestFactory factory = new HttpsClientRequestFactory();
        factory.setConnectTimeout(60 * 1000);
        factory.setReadTimeout(5 * 60 * 1000);
        RestTemplate restTemplate = new RestTemplate(factory);
        Result<InventoryResult> result = restTemplate.postForObject(address.concat(inventoryUrl), request, Result.class);
        log.info("库存同步,返回数据: {}", result);//打印日志2

打印日志1内容为:

http请求入参:{data=[{ productStatus=10,skuCode=null}], messageId=ewpfpr1t6ey5r6qj0su0w1h6rt73hr,token=vgvU5EJKuZbuHii7WH6pTINp40ZRicaqLz4dq5P7L6pDzWir8EEGZhCKPucQjljsw69EHasEy+iJfdTofDg==}

日志打印2没有打印内容!!!

最后发现是因为测试环境中数据量较小,http请求后,很快能得到相应,而正式环境数据量较大,没有及时得到响应,连接或者读取超时!!!

三种解决方式:

第一种

1、添加HttpsClientRequestFactory 类,并继承SimpleClientHttpRequestFactory 

/**
 * 兼容调Https接口
 */
public class HttpsClientRequestFactory extends SimpleClientHttpRequestFactory {
    @Override
    protected void prepareConnection(HttpURLConnection connection, String httpMethod)
            throws IOException {
        if (connection instanceof HttpsURLConnection) {
            prepareHttpsConnection((HttpsURLConnection) connection);
        }
        super.prepareConnection(connection, httpMethod);
    }
    private void prepareHttpsConnection(HttpsURLConnection connection) {
        connection.setHostnameVerifier(new SkipHostnameVerifier());
        try {
            connection.setSSLSocketFactory(createSslSocketFactory());
        }
        catch (Exception ex) {
            // Ignore
        }
    }
    private SSLSocketFactory createSslSocketFactory() throws Exception {
        SSLContext context = SSLContext.getInstance("TLS");
        context.init(null, new TrustManager[] { new SkipX509TrustManager() },
                new SecureRandom());
        return context.getSocketFactory();
    }
    private class SkipHostnameVerifier implements HostnameVerifier {
        @Override
        public boolean verify(String s, SSLSession sslSession) {
            return true;
        }
    }
    private static class SkipX509TrustManager implements X509TrustManager {
        @Override
        public X509Certificate[] getAcceptedIssuers() {
            return new X509Certificate[0];
        }
        @Override
        public void checkClientTrusted(X509Certificate[] chain, String authType) {
        }
        @Override
        public void checkServerTrusted(X509Certificate[] chain, String authType) {
        }
    }
}

2、使用restTemplate发起请求前先设置连接和超时时间即可;

//配置http请求的连接超时时间和读取超时时间
HttpsClientRequestFactory factory = new HttpsClientRequestFactory();
factory.setConnectTimeout(60 * 1000);
factory.setReadTimeout(5 * 60 * 1000);
RestTemplate restTemplate = new RestTemplate(factory);
BaseResult<QueryInventoryResult> result = restTemplate.postForObject(address.concat(inventoryUrl), request, Result.class);

或者通过容器加载配置类,然后设置超时时间进去,使用的时候直接注入restTemplate即可!;

@Configuration
public class RestConfig {
    //60 * 1000
    @Value("${rest.connectTimeout:60000}")
    private int connectTimeout;
    //5 * 60 * 1000
    @Value("${rest.readTimeout:300000}")
    private int readTimeout;
    @Bean
    public RestTemplate restTemplate() {
        SimpleClientHttpRequestFactory simpleClientHttpRequestFactory = new SimpleClientHttpRequestFactory();
        simpleClientHttpRequestFactory.setConnectTimeout(connectTimeout);
        simpleClientHttpRequestFactory.setReadTimeout(readTimeout);
        RestTemplate restTemplate = new RestTemplate(simpleClientHttpRequestFactory);
        return restTemplate;
    }

第二种

@Configuration
public class RestConfig {
    //60 * 1000
    @Value("${rest.connectTimeout:60000}")
    private int connectTimeout;
    //5 * 60 * 1000
    @Value("${rest.readTimeout:300000}")
    private int readTimeout;  
    @Value("${rest.connectionRequestTimeout:300000}")
    private int connectionRequestTimeout;  
  /**
     * 使用 HttpComponentsClientHttpRequestFactory创建http请求(推荐)
     */
    @Bean
    public RestTemplate restTemplate() {
        HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
        httpRequestFactory.setConnectionRequestTimeout(connectionRequestTimeout);
        httpRequestFactory.setConnectTimeout(connectTimeout);
        httpRequestFactory.setReadTimeout(readTimeout);
        return new RestTemplate(httpRequestFactory);
    }
}

第三种(基于第二种升级)

@Configuration
public class RestConfig {
    /**
     * 高并发采用HttpClient连接池
     */
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate(httpRequestFactory());
    }
    @Bean
    public ClientHttpRequestFactory httpRequestFactory() {
        return new HttpComponentsClientHttpRequestFactory(httpClient());
    }
    @Bean
    public HttpClient httpClient() {
        Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
                .register("http", PlainConnectionSocketFactory.getSocketFactory())
                .register("https", SSLConnectionSocketFactory.getSocketFactory())
                .build();
        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry);
        //设置整个连接池最大连接数
        connectionManager.setMaxTotal(400);
        //路由是对maxTotal的细分
        connectionManager.setDefaultMaxPerRoute(100);
        RequestConfig requestConfig = RequestConfig.custom()
                .setSocketTimeout(30000)  //返回数据的超时时间
                .setConnectTimeout(20000) //连接上服务器的超时时间
                .setConnectionRequestTimeout(1000) //从连接池中获取连接的超时时间
                .build();
        return HttpClientBuilder.create()
                .setDefaultRequestConfig(requestConfig)
                .setConnectionManager(connectionManager)
                .build();
    }
}

问题得到解决、、、、、、

到此这篇关于java中http请求之restTemplate配置超时时间的文章就介绍到这了,更多相关restTemplate配置超时时间内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java--Socket通信(客户端服务端双向)

    Java--Socket通信(客户端服务端双向)

    这篇文章主要介绍了Java--Socket通信(客户端服务端双向),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • Java高级语法学习之反射详解

    Java高级语法学习之反射详解

    java的泛型和反射机制一直很难理解和应用,下面这篇文章主要给大家介绍了关于Java高级语法学习之反射的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-01-01
  • JAVA使用TreeMap对字符串进行排序

    JAVA使用TreeMap对字符串进行排序

    这篇文章主要介绍了JAVA使用TreeMap对字符串进行排序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • SpringBoot实现自定义指标监控功能

    SpringBoot实现自定义指标监控功能

    本文主要介绍了SpringBoot实现自定义指标监控功能的实现,,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,感兴趣的小伙伴跟着着小编来一起来学习吧
    2024-01-01
  • Java Spring MVC 上传下载文件配置及controller方法详解

    Java Spring MVC 上传下载文件配置及controller方法详解

    这篇文章主要介绍了Java Spring MVC 上传下载文件配置及controller方法详解,本文介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下
    2016-09-09
  • SpringBoot项目部署的四种方式详解

    SpringBoot项目部署的四种方式详解

    本文详细介绍了SpringBoot项目的四种部署方式,包括原始命令部署、宝塔Linux可视化部署、Docker容器化部署和Docker容器平台托管,每种方式都有其特点和适用场景,需要的朋友可以参考下
    2026-04-04
  • 详解HttpClient用法

    详解HttpClient用法

    HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议,这篇文章主要介绍了详解HttpClient用法,需要的朋友可以参考下
    2021-01-01
  • IntelliJ IDEA 2023.1.4 无法刷新Maven项目模块的问题及解决方法

    IntelliJ IDEA 2023.1.4 无法刷新Maven项目模块的问题及解决方法

    这篇文章主要介绍了如何排查 IDEA 自身报错问题,本文以IntelliJ IDEA 2023.1.4无法刷新项目Maven模块的问题为例,给大家详细讲解,需要的朋友可以参考下
    2023-08-08
  • Java设计模式详解之门面模式(外观模式)

    Java设计模式详解之门面模式(外观模式)

    为子系统中的一组接口提供一个一致的界面, Facade 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。本文给大家介绍Java设计模式详解之门面模式(外观模式),感兴趣的朋友参考下吧
    2016-04-04
  • Java使用flyway实现脚本自动化的方法详解

    Java使用flyway实现脚本自动化的方法详解

    Flyway是一个开源的数据库版本控制工具,主要用于管理数据库的版本和变更,它可以自动化地将数据库迁移到不同的版本,同时支持多种数据库类型,本文给大家介绍了如何使用flyway实现脚本自动化,需要的朋友可以参考下
    2023-10-10

最新评论