前期工作
1引入jar包
在application中加载配置文件
2.写配置文件,application-httpclient.xml根据下面的方法配置xml文件
1.管理器,
<!-- 定义连接管理器 -->
<bean id = "httpClientConnectionManager" class="org.apache.http.impl.conn.PoolingHttpClientConnectionManager">
<property name="maxTotal" value="${http.maxTotal}"/>
<property name="defaultMaxPerRoute" value="${http.defaultMaxPerRoute}"/>
</bean>
2.第一httpclient对象
<!-- 定义一个httpclient构建器 -->
<bean id ="httpClientBuilder" class="org.apache.http.impl.client.HttpClientBuilder">
<property name="connectionManager" ref ="httpClientConnectionManager"></property>
</bean>
<!-- 定义httpclient对象 该对象是多例模式-->
<bean class="org.apache.http.impl.client.CloseableHttpClient"
factory-bean="httpClientBuilder" factory-method="build" scope="prototype">
3.请求参数构造器
<bean id="requestConfigBuilder" class="org.apache.http.client.config.RequestConfig.Builder">
<property name="connectTimeout" value="${http.connectTimeout}"/>
<property name="connectionRequestTimeout" value="${http.connectionRequestTimeout}"/>
<property name="socketTimeout" value="${http.socketTimeout}"/>
<property name="staleConnectionCheckEnabled" value="${http.staleConnectionCheckEnabled}"/>
</bean>
<!-- 定义请求对象参数 单例 -->
<bean class="org.apache.http.client.config.RequestConfig" factory-bean="requestConfigBuilder" factory-method="build"/>
单例和多例的问题:单例变为多例,scope=“prototype”
4.将配置文件传入信息传递给参数对象
5.关闭无效连接
<!-- 定期关闭无效连接 -->
<bean class="com.rookie.web.httpclient.IdleConnectionEvictor">
<constructor-arg index="0" ref="httpClientConnectionManager"/>
</bean>
package cn.itcast.httpclient;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.HttpClientConnectionManager;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.util.EntityUtils;
public class HttpConnectManager {
public static void main(String[] args) throws Exception {
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
// 设置最大连接数
cm.setMaxTotal(200);
// 设置每个主机地址的并发数
cm.setDefaultMaxPerRoute(20);
doGet(cm);
doGet(cm);
}
public static void doGet(HttpClientConnectionManager cm) throws Exception {
//通过连接管理器获取
CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm).build();
// 创建http GET请求
HttpGet httpGet = new HttpGet("http://www.baidu.com/");
CloseableHttpResponse response = null;
try {
// 执行请求
response = httpClient.execute(httpGet);
// 判断返回状态是否为200
if (response.getStatusLine().getStatusCode() == 200) {
String content = EntityUtils.toString(response.getEntity(), "UTF-8");
System.out.println("内容长度:" + content.length());
}
} finally {
if (response != null) {
response.close();
}
// 此处不能关闭httpClient,如果关闭httpClient,连接池也会销毁
// httpClient.close();
}
}
}