2013-12-11 110 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 –