HTTP连接池
Posted 馳騁衿琾
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTP连接池相关的知识,希望对你有一定的参考价值。
<context:property-placeholder location="classpath:conf/framework/httpclient.properties"/> <!-- 定义连接管理器 --> <bean id="httpClientConnectionManager" class="org.apache.http.impl.conn.PoolingHttpClientConnectionManager" destroy-method="close"> <!-- 最大连接数 --> <property name="maxTotal" value="${http.maxTotal}" /> <!-- 设置每个主机地址的并发数 --> <property name="defaultMaxPerRoute" value="${http.defaultMaxPerRoute}" /> </bean> <!-- httpclient对象构建器 --> <bean id="httpClientBuilder" class="org.apache.http.impl.client.HttpClientBuilder"> <!-- 设置连接管理器 --> <property name="connectionManager" ref="httpClientConnectionManager" /> </bean> <!-- 定义Httpclient对象 --> <bean id="httpClient" class="org.apache.http.impl.client.CloseableHttpClient" factory-bean="httpClientBuilder" factory-method="build" scope="prototype"> </bean> <!-- 定义清理无效连接 --> <bean class="com.avcon.platform.dledc.res.service.IdleConnectionEvictor" destroy-method="shutdown"> <constructor-arg index="0" ref="httpClientConnectionManager" /> </bean> <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 id="requestConfig" class="org.apache.http.client.config.RequestConfig" factory-bean="requestConfigBuilder" factory-method="build"> </bean>
@Service public class HttpClientService { @Autowired private CloseableHttpClient httpClient; @Autowired private RequestConfig requestConfig; /** * 执行GET请求 * * @param url * @return * @throws IOException * @throws ClientProtocolException */ public String doGet(String url) throws ClientProtocolException, IOException { // 创建http GET请求 HttpGet httpGet = new HttpGet(url); httpGet.setConfig(this.requestConfig); CloseableHttpResponse response = null; try { // 执行请求 response = httpClient.execute(httpGet); // 判断返回状态是否为200 if (response.getStatusLine().getStatusCode() == 200) { return EntityUtils.toString(response.getEntity(), "UTF-8"); } } finally { if (response != null) { response.close(); } } return null; } /** * 带有参数的GET请求 * * @param url * @param params * @return * @throws URISyntaxException * @throws IOException * @throws ClientProtocolException */ public String doGet(String url, Map<String, String> params) throws ClientProtocolException, IOException, URISyntaxException { URIBuilder uriBuilder = new URIBuilder(url); for (String key : params.keySet()) { uriBuilder.addParameter(key, params.get(key)); } return this.doGet(uriBuilder.build().toString()); } /** * 执行POST请求 * * @param url * @param params * @return * @throws IOException */ public HttpResult doPost(String url, Map<String, String> params) throws IOException { // 创建http POST请求 HttpPost httpPost = new HttpPost(url); httpPost.setConfig(this.requestConfig); if (params != null) { // 设置2个post参数,一个是scope、一个是q List<NameValuePair> parameters = new ArrayList<NameValuePair>(); for (String key : params.keySet()) { parameters.add(new BasicNameValuePair(key, params.get(key))); } // 构造一个form表单式的实体 UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(parameters, "UTF-8"); // 将请求实体设置到httpPost对象中 httpPost.setEntity(formEntity); } CloseableHttpResponse response = null; try { // 执行请求 response = httpClient.execute(httpPost); return new HttpResult(response.getStatusLine().getStatusCode(), EntityUtils.toString(response.getEntity(), "UTF-8")); } finally { if (response != null) { response.close(); } } } /** * 执行POST请求 * * @param url * @return * @throws IOException */ public HttpResult doPost(String url) throws IOException { return this.doPost(url, null); } /** * 提交json数据 * * @param url * @param json * @return * @throws ClientProtocolException * @throws IOException */ public HttpResult doPostJson(String url, String json) throws ClientProtocolException, IOException { // 创建http POST请求 HttpPost httpPost = new HttpPost(url); httpPost.setConfig(this.requestConfig); if (json != null) { // 构造一个form表单式的实体 StringEntity stringEntity = new StringEntity(json, ContentType.APPLICATION_JSON); // 将请求实体设置到httpPost对象中 httpPost.setEntity(stringEntity); } CloseableHttpResponse response = null; try { // 执行请求 response = this.httpClient.execute(httpPost); return new HttpResult(response.getStatusLine().getStatusCode(), EntityUtils.toString(response.getEntity(), "UTF-8")); } finally { if (response != null) { response.close(); } } }
以上是关于HTTP连接池的主要内容,如果未能解决你的问题,请参考以下文章
newCacheThreadPool()newFixedThreadPool()newScheduledThreadPool()newSingleThreadExecutor()自定义线程池(代码片段