最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中http請求之restTemplate配置超時(shí)時(shí)間問題解決

 更新時(shí)間:2023年05月31日 10:31:28   作者:oh?my?gald  
這篇文章主要介紹了java中http請求之restTemplate配置超時(shí)時(shí)間,本文給大家分享三種解決方法,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

問題:http請求發(fā)起后接收不到返回?cái)?shù)據(jù)?。?!【測試環(huán)境沒出問題,發(fā)到正式環(huán)境就有問題】

項(xiàng)目中通過restTemplate發(fā)起請求:

        log.info("請求入?yún)?{}",JSON.toJSONString(request));//打印日志1
        // 配置http請求的連接超時(shí)時(shí)間和讀取超時(shí)時(shí)間
        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("庫存同步,返回?cái)?shù)據(jù): {}", result);//打印日志2

打印日志1內(nèi)容為:

http請求入?yún)?{data=[{ productStatus=10,skuCode=null}], messageId=ewpfpr1t6ey5r6qj0su0w1h6rt73hr,token=vgvU5EJKuZbuHii7WH6pTINp40ZRicaqLz4dq5P7L6pDzWir8EEGZhCKPucQjljsw69EHasEy+iJfdTofDg==}

日志打印2沒有打印內(nèi)容?。?!

最后發(fā)現(xiàn)是因?yàn)闇y試環(huán)境中數(shù)據(jù)量較小,http請求后,很快能得到相應(yīng),而正式環(huán)境數(shù)據(jù)量較大,沒有及時(shí)得到響應(yīng),連接或者讀取超時(shí)?。?!

三種解決方式:

第一種

1、添加HttpsClientRequestFactory 類,并繼承SimpleClientHttpRequestFactory 

/**
 * 兼容調(diào)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發(fā)起請求前先設(shè)置連接和超時(shí)時(shí)間即可;

//配置http請求的連接超時(shí)時(shí)間和讀取超時(shí)時(shí)間
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);

或者通過容器加載配置類,然后設(shè)置超時(shí)時(shí)間進(jìn)去,使用的時(shí)候直接注入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創(chuàng)建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 {
    /**
     * 高并發(fā)采用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);
        //設(shè)置整個(gè)連接池最大連接數(shù)
        connectionManager.setMaxTotal(400);
        //路由是對maxTotal的細(xì)分
        connectionManager.setDefaultMaxPerRoute(100);
        RequestConfig requestConfig = RequestConfig.custom()
                .setSocketTimeout(30000)  //返回?cái)?shù)據(jù)的超時(shí)時(shí)間
                .setConnectTimeout(20000) //連接上服務(wù)器的超時(shí)時(shí)間
                .setConnectionRequestTimeout(1000) //從連接池中獲取連接的超時(shí)時(shí)間
                .build();
        return HttpClientBuilder.create()
                .setDefaultRequestConfig(requestConfig)
                .setConnectionManager(connectionManager)
                .build();
    }
}

問題得到解決、、、、、、

到此這篇關(guān)于java中http請求之restTemplate配置超時(shí)時(shí)間的文章就介紹到這了,更多相關(guān)restTemplate配置超時(shí)時(shí)間內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java--Socket通信(客戶端服務(wù)端雙向)

    Java--Socket通信(客戶端服務(wù)端雙向)

    這篇文章主要介紹了Java--Socket通信(客戶端服務(wù)端雙向),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-01-01
  • Java高級語法學(xué)習(xí)之反射詳解

    Java高級語法學(xué)習(xí)之反射詳解

    java的泛型和反射機(jī)制一直很難理解和應(yīng)用,下面這篇文章主要給大家介紹了關(guān)于Java高級語法學(xué)習(xí)之反射的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-01-01
  • JAVA使用TreeMap對字符串進(jìn)行排序

    JAVA使用TreeMap對字符串進(jìn)行排序

    這篇文章主要介紹了JAVA使用TreeMap對字符串進(jìn)行排序,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • SpringBoot實(shí)現(xiàn)自定義指標(biāo)監(jiān)控功能

    SpringBoot實(shí)現(xiàn)自定義指標(biāo)監(jiān)控功能

    本文主要介紹了SpringBoot實(shí)現(xiàn)自定義指標(biāo)監(jiān)控功能的實(shí)現(xiàn),,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,感興趣的小伙伴跟著著小編來一起來學(xué)習(xí)吧
    2024-01-01
  • Java Spring MVC 上傳下載文件配置及controller方法詳解

    Java Spring MVC 上傳下載文件配置及controller方法詳解

    這篇文章主要介紹了Java Spring MVC 上傳下載文件配置及controller方法詳解,本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-09-09
  • SpringBoot項(xiàng)目部署的四種方式詳解

    SpringBoot項(xiàng)目部署的四種方式詳解

    本文詳細(xì)介紹了SpringBoot項(xiàng)目的四種部署方式,包括原始命令部署、寶塔Linux可視化部署、Docker容器化部署和Docker容器平臺托管,每種方式都有其特點(diǎn)和適用場景,需要的朋友可以參考下
    2026-04-04
  • 詳解HttpClient用法

    詳解HttpClient用法

    HttpClient是Apache Jakarta Common下的子項(xiàng)目,用來提供高效的、最新的、功能豐富的支持HTTP協(xié)議的客戶端編程工具包,并且它支持HTTP協(xié)議最新的版本和建議,這篇文章主要介紹了詳解HttpClient用法,需要的朋友可以參考下
    2021-01-01
  • IntelliJ?IDEA?2023.1.4?無法刷新Maven項(xiàng)目模塊的問題及解決方法

    IntelliJ?IDEA?2023.1.4?無法刷新Maven項(xiàng)目模塊的問題及解決方法

    這篇文章主要介紹了如何排查?IDEA?自身報(bào)錯問題,本文以IntelliJ?IDEA?2023.1.4無法刷新項(xiàng)目Maven模塊的問題為例,給大家詳細(xì)講解,需要的朋友可以參考下
    2023-08-08
  • Java設(shè)計(jì)模式詳解之門面模式(外觀模式)

    Java設(shè)計(jì)模式詳解之門面模式(外觀模式)

    為子系統(tǒng)中的一組接口提供一個(gè)一致的界面, Facade 模式定義了一個(gè)高層接口,這個(gè)接口使得這一子系統(tǒng)更加容易使用。本文給大家介紹Java設(shè)計(jì)模式詳解之門面模式(外觀模式),感興趣的朋友參考下吧
    2016-04-04
  • Java使用flyway實(shí)現(xiàn)腳本自動化的方法詳解

    Java使用flyway實(shí)現(xiàn)腳本自動化的方法詳解

    Flyway是一個(gè)開源的數(shù)據(jù)庫版本控制工具,主要用于管理數(shù)據(jù)庫的版本和變更,它可以自動化地將數(shù)據(jù)庫遷移到不同的版本,同時(shí)支持多種數(shù)據(jù)庫類型,本文給大家介紹了如何使用flyway實(shí)現(xiàn)腳本自動化,需要的朋友可以參考下
    2023-10-10

最新評論

阳春市| 绥中县| 营山县| 汉寿县| 错那县| 和硕县| 襄汾县| 武安市| 康马县| 永丰县| 海盐县| 彩票| 南川市| 防城港市| 从江县| 弥渡县| 南投市| 六盘水市| 循化| 洪湖市| 秦皇岛市| 乌苏市| 衡山县| 井冈山市| 嵊州市| 乡城县| 阿拉善左旗| 台南市| 台前县| 湄潭县| 渭源县| 陈巴尔虎旗| 天长市| 乐昌市| 会宁县| 平阳县| 诸城市| 宁阳县| 西昌市| 招远市| 陇南市|