2013-12-11 34 views
7

Tôi hiện đang cố gắng thực hiện nhiều yêu cầu HttpGet cùng một lúc với CloseableHttpClient.
Tôi googled về cách làm điều đó và câu trả lời là sử dụng PoolingHttpClientConnectionManager.
PoolingHttpClientConnectionQuản lý: Cách thực hiện các yêu cầu Https?

Tại thời điểm này, tôi nhận điều này:

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

Sau đó, tôi đã cố gắng yêu cầu HttpGet-http://www.google.com và tất cả mọi thứ làm việc tốt.

Sau đó, tôi đã tạo ra một truststore qua cmd và nhập khẩu giấy chứng nhận của trang web nhắm mục tiêu, thiết lập một SSLConnectionSocketFactory với truststore của tôi và thiết lập SSLSocketFactory của httpClient:

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(); 

Nếu tôi cố gắng thực hiện một Https HttpGet sau đó Tôi nhận được một ngoại lệ PKIX path building failed.
Nếu tôi làm như vậy mà không cần .setConnectionManager(cManager) mọi thứ hoạt động tốt.

Bất kỳ ai trong bạn có thể cho tôi biết cách tôi có thể làm việc này không? (Đừng lo lắng, tôi không tạo bất kỳ công cụ ddos ​​nào)

Cảm ơn bạn trước!

P.S .: Tôi đang sử dụng HttpComponents 4.3.1

Trả lời

13

Tìm thấy câu trả lời: https://stackoverflow.com/a/19950935/1223253

Chỉ cần có thêm

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

và vượt qua socketFactoryRegistry như tham số cho constructor của PoolingHttpClientConnectionManager. Bây giờ nó hoạt động tốt :)

+0

Làm thế nào để sử dụng PoolingHttpClientConnectionManager sau khi tạo này, mã của tôi đang làm việc nhưng tôi muốn biết kết nối hoạt động tổng hợp hoặc không – Labeo

+1

bật đăng nhập khách hàng để kiểm tra thuê từ hồ bơi kết nối: http://hc.apache.org/httpcomponents-client-ga/logging.html –

Các vấn đề liên quan