2013-12-11 145 views
7

我目前正在嘗試使用CloseableHttpClient同時處理多個HttpGet請求。
我搜索瞭如何做到這一點,答案是使用PoolingHttpClientConnectionManager
PoolingHttpClientConnectionManager:如何做Https請求?

在這一點上,我得到這個:

PoolingHttpClientConnectionManager cManager = new PoolingHttpClientConnectionManager(); 
CloseableHttpClient httpClient = HttpClients.custom() 
    .setConnectionManager(cManager) 
    .build(); 

然後我嘗試了HttpGet請求http://www.google.com和一切工作正常。

然後,我通過CMD創建了一個信任和我的信任進口目標網站的證書,設置一個SSLConnectionSocketFactory並設置SSLSocketFactoryhttpClient的:

KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
FileInputStream inputStream = new FileInputStream(new File("myTrustStore.truststore")); 
trustStore.load(inputStream, "nopassword".toCharArray()); 
inputStream.close(); 

SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(trustStore).build(); 
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, 
    SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); 

PoolingHttpClientConnectionManager cManager = new PoolingHttpClientConnectionManager(); 
CloseableHttpClient httpClient = HttpClients.custom() 
    .setSSLSocketFactory(sslsf) 
    .setConnectionManager(cManager) 
    .build(); 

如果我嘗試執行的Https HttpGet然後我得到一個PKIX path building failed例外。
如果我這樣做沒有.setConnectionManager(cManager)一切工作正常。

你們中的任何人都可以告訴我如何讓這個工作? (別擔心,我不會創建任何ddos工具)

在此先感謝!

P.S:我使用的是HttpComponents 4.3.1

回答

13

找到了答案: https://stackoverflow.com/a/19950935/1223253

就不得不添加

Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create().register("https", sslsf).build(); 

,並通過socketFactoryRegistry作爲參數的PoolingHttpClientConnectionManager構造。 現在它工作得很好:)

+0

如何使用PoolingHttpClientConnectionManager創建後,我的代碼正在工作,但我想知道連接池是否有效 – Labeo

+1

打開客戶端日誌記錄以檢查連接池中的租約:http:/ /hc.apache.org/httpcomponents-client-ga/logging.html –