当前位置: 首页> 娱乐> 影视 > 哈尔滨新闻头条最新消息_企业网站推广的线上渠道有哪些?_什么样的人适合做策划_深圳百度关键词排名

哈尔滨新闻头条最新消息_企业网站推广的线上渠道有哪些?_什么样的人适合做策划_深圳百度关键词排名

时间:2025/7/14 0:30:07来源:https://blog.csdn.net/netyeaxi/article/details/146379052 浏览次数:0次
哈尔滨新闻头条最新消息_企业网站推广的线上渠道有哪些?_什么样的人适合做策划_深圳百度关键词排名

当使用Apache HttpClient组件时,经常会用到它的连接池组件。典型的代码如下:

		PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();connectionManager.setMaxTotal(httpConfig.getMaxPoolTotal());connectionManager.setDefaultMaxPerRoute(httpConfig.getMaxDefaultPerRoute());RequestConfig requestConfig = RequestConfig.custom() //.setConnectTimeout(httpConfig.getConnectTimeout()) //.setConnectionRequestTimeout(httpConfig.getConnectionRequestTimeout())//.setSocketTimeout(httpConfig.getSocketTimeout())//.build();HttpClientBuilder httpClientBuilder = HttpClientBuilder.create() //.setConnectionManager(connectionManager) //.setDefaultRequestConfig(requestConfig) //.useSystemProperties();HttpClient httpClient = httpClientBuilder.build();

其中maxTotal表示此连接池的最大连接数,defaultMaxPerRoute表示每路由最大连接数。这里主涉及到route在Apache HttpClient组件中是怎么使用的问题。先分析一下Apache HttpClient的源代码。以下使用的源代码版本4.5.14。

org.apache.http.impl.client.InternalHttpClient

 可以看到这个方法传入的还是HttpHost,也就是请求地址,但下面就通过determineRoute方法生成了一个HttpRoute,并且后续也是使用HttpRoute。

org.apache.http.impl.conn.DefaultRoutePlanner

 可以看到默认情况下,路由中的地址就是主机地址。

org.apache.http.impl.execchain.MainClientExec

 

这里也是使用HttpRoute。

org.apache.http.impl.conn.PoolingHttpClientConnectionManager

这里又开始使用HttpHost。

org.apache.http.impl.conn.DefaultHttpClientConnectionOperator

       这里会解析hostName,如果通过hostName能解析出多个IP地址,则依次使用这些IP尝试创建socket,只要有一个能创建成功,则停止尝试。

       从上述代码中可以看到,是按路由地址创建连接池的,如果路由地址中的主机地址可以解析成多个IP地址时,只会使用第一个可用的IP地址。

      一般都是通过域名访问其它服务,而域名一般可以解析出多个IP,而域名默认情况下就是路由主机地址,只能为其中一个IP建立连接,且能创建的最大连接数就是defaultMaxPerRoute的值。这样远远达不到maxTotal的值。

       当然,有一种办法是直接使用域名解析出的多个IP访问其它服务,这样每个IP就是一个路由,最后创建的总连接数就可以达到maxTotal的值。但这样的最大弊端是域名解析出的IP一般是动态的,可能会不但变化,程序中写死IP是非常不灵活的。

       那有没有两全其美的办法,既使用域名访问其它服务,又使用域名解析后的IP作为路由创建连接池,使用连接数创建到最大值。办法是有的,只要实现一个RoutePlanner就行。

public class TestRoutePlanner implements RoutePlanner {private final Random random = new Random();public HttpRoute determineRoute(HttpHost host, HttpRequest reqt, HttpContext ctx) {InetAddress[] addrs = InetAddress.getAllByName(host.getHostnName());int idx = random.mextInt(addrs.length);String hostAddr = addrs[idx]getHostAddress();HttpHost newHost = new HttpHost(hostAddr, host.getPort(), host.getSchemeName());return new HttpRoute(newHost, null, false);}
}

 然后将TestRoutePlanner添加到HttpClient中。

		HttpClientBuilder httpClientBuilder = HttpClientBuilder.create() //.setConnectionManager(connectionManager) //.setDefaultRequestConfig(requestConfig) //.setRoutePlanner(new TestRoutePlanner())//.useSystemProperties();

       上述TestRoutePlanner写的比较简单,性能也不太好,只是不演示功能而已,实际使用时还需要进一步改造。

 

 

关键字:哈尔滨新闻头条最新消息_企业网站推广的线上渠道有哪些?_什么样的人适合做策划_深圳百度关键词排名

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: