springboot集成HttpClient

本文介绍如何在SpringBoot项目中集成Apache HttpClient,包括添加Maven依赖、配置连接池、创建连接管理器、设置连接超时时间及维护连接的有效性检查。同时提供了一个简单的测试示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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" ;
}


}


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值