本文共 9073 字,大约阅读时间需要 30 分钟。
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm).build();// URIs to perform GETs onString[] urisToGet = {"http://www.domain1.com/","http://www.domain2.com/", "http://www.domain3.com/","http://www.domain4.com/"};// create a thread for each URIGetThread[] threads = new GetThread[urisToGet.length];for (int i = 0; i < threads.length; i++) { HttpGet httpget = new HttpGet(urisToGet[i]); threads[i] = new GetThread(httpClient, httpget);}// start the threadsfor (int j = 0; j < threads.length; j++) { threads[j].start();}// join the threadsfor (int j = 0; j < threads.length; j++) { threads[j].join();}一个HttpClient实例是线程安全的,并且能够在多个执行线程直接共享,强烈建议每个线程保持一个它自己专有的HttpContext实例。
static class GetThread extends Thread { private final CloseableHttpClient httpClient; private final HttpContext context; private final HttpGet httpget; public GetThread(CloseableHttpClient httpClient, HttpGet httpget) { this.httpClient = httpClient; this.context = HttpClientContext.create(); this.httpget = httpget; } @Override public void run() { try { CloseableHttpResponse response = httpClient.execute( httpget, context); try { HttpEntity entity = response.getEntity(); } finally { response.close(); } } catch (ClientProtocolException ex) { // Handle protocol errors } catch (IOException ex) { // Handle I/O errors } }}
public static class IdleConnectionMonitorThread extends Thread { private final HttpClientConnectionManager connMgr; private volatile boolean shutdown; public IdleConnectionMonitorThread(HttpClientConnectionManager connMgr) { super(); this.connMgr = connMgr; } @Override public void run() { try { while (!shutdown) { synchronized (this) { wait(5000); // Close expired connections connMgr.closeExpiredConnections(); // Optionally, close connections // that have been idle longer than 30 sec connMgr.closeIdleConnections(30, TimeUnit.SECONDS); } } } catch (InterruptedException ex) { // terminate } } public void shutdown() { shutdown = true; synchronized (this) { notifyAll(); } }}
ConnectionKeepAliveStrategy myStrategy = new ConnectionKeepAliveStrategy() { public long getKeepAliveDuration(HttpResponse response, HttpContext context) { // Honor 'keep-alive' header HeaderElementIterator it = new BasicHeaderElementIterator( response.headerIterator(HTTP.CONN_KEEP_ALIVE)); while (it.hasNext()) { HeaderElement he = it.nextElement(); String param = he.getName(); String value = he.getValue(); if (value != null && param.equalsIgnoreCase("timeout")) { try { return Long.parseLong(value) * 1000; } catch(NumberFormatException ignore) { } } } HttpHost target = (HttpHost) context.getAttribute( HttpClientContext.HTTP_TARGET_HOST); if ("www.naughty-server.com".equalsIgnoreCase(target.getHostName())) { // Keep alive for 5 seconds only return 5 * 1000; } else { // otherwise keep alive for 30 seconds return 30 * 1000; } }};CloseableHttpClient client = HttpClients.custom().setKeepAliveStrategy(myStrategy).build();
HttpClientContext clientContext = HttpClientContext.create();PlainConnectionSocketFactory sf = PlainConnectionSocketFactory.getSocketFactory();Socket socket = sf.createSocket(clientContext);int timeout = 1000; //msHttpHost target = new HttpHost("localhost");InetSocketAddress remoteAddress = new InetSocketAddress(netAddress.getByAddress(new byte[] {127,0,0,1}), 80);sf.connectSocket(timeout, socket, target, remoteAddress, null, clientContext);
ConnectionSocketFactory plainsf = <...>LayeredConnectionSocketFactory sslsf = <...>Registryr = RegistryBuilder. create() .register("http", plainsf).register("https", sslsf).build();HttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(r);HttpClients.custom().setConnectionManager(cm).build();
KeyStore myTrustStore = <...>SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(myTrustStore).build();SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);SSLSocketFactory的定制意味着对SSL/TLS协议概念有一定的熟悉,详细说明它超出 了本文档的范围。请参考Java™Secure Socket Extension(JSSE) 参考指南[http://java.sun.com/j2se/1.5.0/docs/guide/security/jsse/JSSERefGuide.html],从而获得javax.net.ssl.SSLContext的详细描述和相关工具。
SSLContext sslContext = SSLContexts.createSystemDefault();SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE);在HttpClient 4.4 版本,使用被Mozilla Foundation维护的公共的后缀列表,确保SSL证书中的通配符不能够被滥用来在顶级域名下启用多个域名。HttpClient在发布时复制了一份列表。 最新的版本列表能够在https://publicsuffix.org/list/ [https://publicsuffix.org/list/ effective_tld_names.dat]找到。强烈建议下载一份列表,防止在每天使用时访问原始位置。
PublicSuffixMatcher publicSuffixMatcher = PublicSuffixMatcherLoader.load( PublicSuffixMatcher.class.getResource("my-copy-effective_tld_names.dat"));DefaultHostnameVerifier hostnameVerifier = new DefaultHostnameVerifier (publicSuffixMatcher)
SystemDefaultRoutePlanner routePlanner = new SystemDefaultRoutePlanner(ProxySelector.getDefault());CloseableHttpClient httpclient = HttpClients.custom() .setRoutePlanner(routePlanner) build();你也可以实现一个自定义的RoutePlanner,来实现一个在完整控制HTTP路由计算的处理器。
HttpRoutePlanner routePlanner = new HttpRoutePlanner() { public HttpRoute determineRoute( HttpHost target, HttpRequest request, HttpContext context) throws HttpException { return new HttpRoute(target, null, new HttpHost("someproxy", 8080), "https".equalsIgnoreCase(target.getSchemeName())); }};CloseableHttpClient httpclient = HttpClients.custom() .setRoutePlanner(routePlanner).build();
转载地址:http://gnhgi.baihongyu.com/