广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >java中http请求之restTemplate配置超时时间(亲测有用!)
  • 921
分享到

java中http请求之restTemplate配置超时时间(亲测有用!)

javahttpservlet 2023-09-06 07:09:34 921人浏览 八月长安
摘要

问题:Http请求发起后接收不到返回数据!!!【测试环境没出问题,发到正式环境就有问题】 项目中通过restTemplate发起请求: log.info("请求入参:{}",JSON.tojsONString(reques

问题: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 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请求后,很快能得到相应,而正式环境数据量较大,没有及时得到响应,连接或者读取超时!!!

三种解决方式:

第一种

添加HttpsClientRequestFactory 类,并继承SimpleClientHttpRequestFactory 

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

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

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

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

@Configurationpublic 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;    }

第二种

@Configurationpublic 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;        @Bean    public RestTemplate restTemplate() {        HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();        httpRequestFactory.setConnectionRequestTimeout(connectionRequestTimeout);        httpRequestFactory.setConnectTimeout(connectTimeout);        httpRequestFactory.setReadTimeout(readTimeout);        return new RestTemplate(httpRequestFactory);    }}

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

@Configurationpublic class RestConfig {           @Bean    public RestTemplate restTemplate() {        return new RestTemplate(httpRequestFactory());    }    @Bean    public ClientHttpRequestFactory httpRequestFactory() {        return new HttpComponentsClientHttpRequestFactory(httpClient());    }    @Bean    public HttpClient httpClient() {        ReGIStry registry = RegistryBuilder.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();    }}

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

来源地址:https://blog.csdn.net/qq_61367293/article/details/126616945

--结束END--

本文标题: java中http请求之restTemplate配置超时时间(亲测有用!)

本文链接: https://www.lsjlt.com/news/396609.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作