springboot集成HttpClient
一:添加maven依赖:
<!-- 集成HttpClient-->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
</dependency>
二:配置文件
#最大连接数
http.maxTotal
=
100
#并发数
http.defaultMaxPerRoute
=
20
#创建连接的最长时间
http.connectTimeout
=
1000
#从连接池中获取到连接的最长时间
http.connectionRequestTimeout
=
500
#数据传输的最长时间
http.socketTimeout
=
100000000
#提交请求前测试连接是否可用
http.staleConnectionCheckEnabled
=
true
三:注册资源管理池
package
com.metaservice.http;
import
org.apache.http.client.config.RequestConfig;
import
org.apache.http.impl.client.CloseableHttpClient;
import
org.apache.http.impl.client.HttpClientBuilder;
import
org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import
org.springframework.beans.factory.annotation.
Qualifier
;
import
org.springframework.beans.factory.annotation.
Value
;
import
org.springframework.context.annotation.
Bean
;
import
org.springframework.context.annotation.
Configuration
;
/**
* Created by hadoop on 2018/6/13.
*/
@Configuration
public class
HttpClient {
@Value
(
"${http.maxTotal}"
)
private
Integer
maxTotal
;
@Value
(
"${http.defaultMaxPerRoute}"
)
private
Integer
defaultMaxPerRoute
;
@Value
(
"${http.connectTimeout}"
)
private
Integer
connectTimeout
;
@Value
(
"${http.connectionRequestTimeout}"
)
private
Integer
connectionRequestTimeout
;
@Value
(
"${http.socketTimeout}"
)
private
Integer
socketTimeout
;
@Value
(
"${http.staleConnectionCheckEnabled}"
)
private boolean
staleConnectionCheckEnabled
;
/**
* 首先实例化一个连接池管理器,设置最大连接数、并发连接数
*
@return
*/
@Bean
(name =
"httpClientConnectionManager"
)
public
PoolingHttpClientConnectionManager getHttpClientConnectionManager(){
PoolingHttpClientConnectionManager httpClientConnectionManager =
new
PoolingHttpClientConnectionManager();
//最大连接数
httpClientConnectionManager.setMaxTotal(
maxTotal
);
//并发数
httpClientConnectionManager.setDefaultMaxPerRoute(
defaultMaxPerRoute
);
return
httpClientConnectionManager;
}
/**
* 实例化连接池,设置连接池管理器。
* 这里需要以参数形式注入上面实例化的连接池管理器
*
@param
httpClientConnectionManager
*
@return
*/
@Bean
(name =
"httpClientBuilder"
)
public
HttpClientBuilder getHttpClientBuilder(
@Qualifier
(
"httpClientConnectionManager"
) PoolingHttpClientConnectionManager httpClientConnectionManager){
//HttpClientBuilder中的构造方法被protected修饰,所以这里不能直接使用new来实例化一个HttpClientBuilder,可以使用HttpClientBuilder提供的静态方法create()来获取HttpClientBuilder对象
HttpClientBuilder httpClientBuilder = HttpClientBuilder.
create
();
httpClientBuilder.setConnectionManager(httpClientConnectionManager);
return
httpClientBuilder;
}
/**
* 注入连接池,用于获取httpClient
*
@param
httpClientBuilder
*
@return
*/
@Bean
public
CloseableHttpClient getCloseableHttpClient(
@Qualifier
(
"httpClientBuilder"
) HttpClientBuilder httpClientBuilder){
return
httpClientBuilder.build();
}
/**
* Builder是RequestConfig的一个内部类
* 通过RequestConfig的custom方法来获取到一个Builder对象
* 设置builder的连接信息
* 这里还可以设置proxy,cookieSpec等属性。有需要的话可以在此设置
*
@return
*/
@Bean
(name =
"builder"
)
public
RequestConfig.Builder getBuilder(){
RequestConfig.Builder builder = RequestConfig.
custom
();
return
builder.setConnectTimeout(
connectTimeout
)
.setConnectionRequestTimeout(
connectionRequestTimeout
)
.setSocketTimeout(
socketTimeout
)
.setStaleConnectionCheckEnabled(
staleConnectionCheckEnabled
);
}
/**
* 使用builder构建一个RequestConfig对象
*
@param
builder
*
@return
*/
@Bean
public
RequestConfig getRequestConfig(
@Qualifier
(
"builder"
) RequestConfig.Builder builder){
return
builder.build();
}
}
四:统一返回结果
package
com.metaservice.http;
/**
* Created by hadoop on 2018/6/13.
*/
public class
HttpResult {
/**
* 状态码
*/
private
Integer
status
;
/**
* 返回数据
*/
private
String
data
;
public
HttpResult() {
}
public
HttpResult(Integer status, String data) {
this
.
status
= status;
this
.
data
= data;
}
public
Integer getStatus() {
return
status
;
}
public void
setStatus(Integer status) {
this
.
status
= status;
}
public
String getData() {
return
data
;
}
public void
setData(String data) {
this
.
data
= data;
}
}
五:添加守护线程,清除管理池中的无用httpClient线程
package
com.metaservice.http;
import
org.apache.http.conn.HttpClientConnectionManager;
import
org.springframework.beans.factory.annotation.
Autowired
;
import
org.springframework.stereotype.
Component
;
/**
* Created by hadoop on 2018/6/13.
*/
@Component
public class
IdleConnectionEvictor
extends
Thread {
@Autowired
private
HttpClientConnectionManager
connMgr
;
private volatile boolean
shutdown
;
public
IdleConnectionEvictor() {
super
();
super
.start();
}
@Override
public void
run() {
try
{
while
(!
shutdown
) {
synchronized
(
this
) {
wait(
5000
);
// 关闭失效的连接
connMgr
.closeExpiredConnections();
}
}
}
catch
(InterruptedException ex) {
// 结束
}
}
//关闭清理无效连接的线程
public void
shutdown() {
shutdown
=
true
;
synchronized
(
this
) {
notifyAll();
}
}
}
六:测试访问
package
com.metaservice.asynctask.controller;
import
com.metaservice.asynctask.bean.ResourceVersion;
import
com.metaservice.asynctask.service.impl.ResourceVersionImpl;
import
com.metaservice.http.HttpAPIService;
import
org.apache.logging.log4j.LogManager;
import
org.apache.logging.log4j.Logger;
import
org.springframework.beans.factory.annotation.
Autowired
;
import
org.springframework.stereotype.
Component
;
import
org.springframework.web.bind.annotation.
RequestMapping
;
import
org.springframework.web.bind.annotation.RequestMethod;
import
org.springframework.web.bind.annotation.
RestController
;
/**
* Created by hadoop on 2018/6/11.
*/
@RestController
@RequestMapping
(
"/api/thred"
)
@Component
public class
test {
private static final
Logger
logger
= LogManager.
getLogger
(test.
class
);
@Autowired
private
HttpAPIService
httpAPIService
;
@RequestMapping
(
"httpclient"
)
public
String httptest()
throws
Exception {
String str =
httpAPIService
.doGet(
"http://www.baidu.com"
);
System.
out
.println(str);
logger
.info(str);
return
"sucess"
;
}
}