HttpClient和Lucene一样,每个版本的API都变化很大,这有点让人头疼。
笔者碰到的情况最早在hadoop环境用httpclient发起httpjson请求,在本地调试的时候用的4.5.2版本,放到hadoop环境中运行报错,无奈只好将httpclient降级成4.2.5版本。最后终于用了低版本的httpclient完成了任务。
如下是我这边整理了一下两个版本连接池的方法:
1、httpclient4.X版本以上,httpclient4.3版本过时:
/**
*
* 避免HttpClient的”SSLPeerUnverifiedException: peer not authenticated”异常
* 不用导入SSL证书 私有函数,初始化连接池
*因大部分的hadoop本身带的httpclient4.2.5版本,故将4.X的部分放到这个地方
* @param maxTotalConn
* 最大连接数
* @param maxRouteConn
* 每路由最大连接数
*/
private synchronized void initConnManager(int maxTotalConn, int maxRouteConn) {
try {
SSLContext ctx = SSLContext.getInstance("TLS");
X509TrustManager tm = new X509TrustManager() {
@Override
public void checkClientTrusted(
java.security.cert.X509Certificate[] arg0, String arg1)
throws java.security.cert.CertificateException {
}
@Override
public void checkServerTrusted(
java.security.cert.X509Certificate[] arg0, String arg1)
throws java.security.cert.CertificateException {
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
};
ctx.init(null, new TrustManager[] { tm }, null);
SSLSocketFactory ssf = new SSLSocketFactory(ctx,
SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(new Scheme("http", 80, PlainSocketFactory
.getSocketFactory()));
schemeRegistry.register(new Scheme("https", 443, ssf.getSocketFactory()));
cm = new ThreadSafeClientConnManager(schemeRegistry);
cm.setMaxTotal(maxTotalConn);
cm.setDefaultMaxPerRoute(maxRouteConn);
} catch (KeyManagementException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
2、httpclient4.3以上版本:
/**
* 获得https的连接
* 避免HttpClient的”SSLPeerUnverifiedException: peer not authenticated”异常
* 不用导入SSL证书.
* 私有函数,初始化连接池
*
* @param maxTotalConn
* 最大连接数
* @param maxRouteConn
* 每路由最大连接数
*/
private synchronized void initConnManager(int maxTotalConn, int maxRouteConn) {
try {
SSLContext ctx = SSLContext.getInstance("TLS");
X509TrustManager tm = new X509TrustManager() {
@Override
public void checkClientTrusted(
java.security.cert.X509Certificate[] arg0, String arg1)
throws java.security.cert.CertificateException {
}
@Override
public void checkServerTrusted(
java.security.cert.X509Certificate[] arg0, String arg1)
throws java.security.cert.CertificateException {
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
};
ctx.init(null, new TrustManager[] { tm }, new SecureRandom());
SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(
ctx, NoopHostnameVerifier.INSTANCE);
ConnectionSocketFactory plainsf = PlainConnectionSocketFactory
.getSocketFactory();
Registry<ConnectionSocketFactory> registry = RegistryBuilder
.<ConnectionSocketFactory> create()
.register("http", plainsf).register("https", socketFactory)
.build();
cm = new PoolingHttpClientConnectionManager(registry);
// 将最大连接数增加
cm.setMaxTotal(maxTotalConn);
// 将每个路由基础的连接增加
cm.setDefaultMaxPerRoute(maxRouteConn);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException();
}
}