springboot整合httpClient代码实例
这篇文章主要介绍了springboot整合httpClient代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
创建httpClientConfig配置类
@Configuration
@PropertySource(value="classpath:/properties/httpClient.properties")
publicclassHttpClientConfig{
@Value("${http.maxTotal}")
privateIntegermaxTotal;//最大连接数
@Value("${http.defaultMaxPerRoute}")
privateIntegerdefaultMaxPerRoute;//最大并发链接数
@Value("${http.connectTimeout}")
privateIntegerconnectTimeout;//创建链接的最大时间
@Value("${http.connectionRequestTimeout}")
privateIntegerconnectionRequestTimeout;//链接获取超时时间
@Value("${http.socketTimeout}")
privateIntegersocketTimeout;//数据传输最长时间
@Value("${http.staleConnectionCheckEnabled}")
privatebooleanstaleConnectionCheckEnabled;//提交时检查链接是否可用
//定义httpClient链接池
@Bean(name="httpClientConnectionManager")
publicPoolingHttpClientConnectionManagergetPoolingHttpClientConnectionManager(){
PoolingHttpClientConnectionManagermanager=newPoolingHttpClientConnectionManager();
manager.setMaxTotal(maxTotal);//设定最大链接数
manager.setDefaultMaxPerRoute(defaultMaxPerRoute);//设定并发链接数
returnmanager;
}
//定义HttpClient
/**
*实例化连接池,设置连接池管理器。
*这里需要以参数形式注入上面实例化的连接池管理器
@Qualifier指定bean标签进行注入
*/
@Bean(name="httpClientBuilder")
publicHttpClientBuildergetHttpClientBuilder(@Qualifier("httpClientConnectionManager")PoolingHttpClientConnectionManagerhttpClientConnectionManager){
//HttpClientBuilder中的构造方法被protected修饰,所以这里不能直接使用new来实例化一个HttpClientBuilder,可以使用HttpClientBuilder提供的静态方法create()来获取HttpClientBuilder对象
HttpClientBuilderhttpClientBuilder=HttpClientBuilder.create();
httpClientBuilder.setConnectionManager(httpClientConnectionManager);
returnhttpClientBuilder;
}
/**
*注入连接池,用于获取httpClient
*@paramhttpClientBuilder
*@return
*/
@Bean
publicCloseableHttpClientgetCloseableHttpClient(@Qualifier("httpClientBuilder")HttpClientBuilderhttpClientBuilder){
returnhttpClientBuilder.build();
}
/**
*Builder是RequestConfig的一个内部类
*通过RequestConfig的custom方法来获取到一个Builder对象
*设置builder的连接信息
*@return
*/
@Bean(name="builder")
publicRequestConfig.BuildergetBuilder(){
RequestConfig.Builderbuilder=RequestConfig.custom();
returnbuilder.setConnectTimeout(connectTimeout)
.setConnectionRequestTimeout(connectionRequestTimeout)
.setSocketTimeout(socketTimeout)
.setStaleConnectionCheckEnabled(staleConnectionCheckEnabled);
}
/**
*使用builder构建一个RequestConfig对象
*@parambuilder
*@return
*/
@Bean
publicRequestConfiggetRequestConfig(@Qualifier("builder")RequestConfig.Builderbuilder){
returnbuilder.build();
}
}
创建HttpClientClose关闭配置类
@Component//交给spring容器管理
publicclassHttpClientCloseextendsThread{
@Autowired
privatePoolingHttpClientConnectionManagermanage;
privatevolatilebooleanshutdown;//开关volatitle表示多线程可变数据,一个线程修改,其他线程立即修改
publicHttpClientClose(){
///System.out.println("执行构造方法,实例化对象");
//线程开启启动
this.start();
}
@Override
publicvoidrun(){
try{
//如果服务没有关闭,执行线程
while(!shutdown){
synchronized(this){
wait(5000);//等待5秒
//System.out.println("线程开始执行,关闭超时链接");
//关闭超时的链接
PoolStatsstats=manage.getTotalStats();
intav=stats.getAvailable();//获取可用的线程数量
intpend=stats.getPending();//获取阻塞的线程数量
intlea=stats.getLeased();//获取当前正在使用的链接数量
intmax=stats.getMax();
//System.out.println("max/"+max+":av/"+av+":pend/"+pend+":lea/"+lea);
manage.closeExpiredConnections();
}
}
}catch(Exceptione){
e.printStackTrace();
thrownewRuntimeException();
}
super.run();
}
//关闭清理无效连接的线程
@PreDestroy//容器关闭时执行该方法.
publicvoidshutdown(){
shutdown=true;
synchronized(this){
//System.out.println("关闭全部链接!!");
notifyAll();//全部从等待中唤醒.执行关闭操作;
}
}
编写工具类HttpClientService
@Service
publicclassHttpClientService{
@Autowired
privateCloseableHttpClienthttpClient;
@Autowired
privateRequestConfigrequestConfig;
/**
*通过给的url地址,获取服务器数据
*@paramurl服务器地址
*@paramparams封装用户参数
*@paramcharset设定字符编码
*@return
*/
publicStringdoGet(Stringurl,Mapparams,Stringcharset){
if(StringUtils.isEmpty(charset)){
charset="utf-8";
}
//判断是否有参数
if(params!=null){
url+="?";
for(Map.Entryentry:params.entrySet()){
Stringkey=entry.getKey();
Stringvalue=entry.getValue();
url+=key+"="+value+"&";
}
url=url.substring(0,url.length()-1);
}
HttpGethttpGet=newHttpGet(url);
httpGet.setConfig(requestConfig);
Stringresult="";
try{
CloseableHttpResponseresponse=httpClient.execute(httpGet);
if(response.getStatusLine().getStatusCode()==200){
result=EntityUtils.toString(response.getEntity(),charset);
}
}catch(IOExceptione){
e.printStackTrace();
thrownewRuntimeException(e);
}
returnresult;
}
publicStringdoGet(Stringurl,Mapparams){
returndoGet(url,params,null);
}
publicStringdoGet(Stringurl){
returndoGet(url,null,null);
}
publicTdoGet(Stringurl,ClasstClass,Mapmap,StringcharSet){
Stringresult=doGet(url,map,charSet);
returnObjectMapperUtil.toObject(result,tClass);
}
}
测试类:
@SpringBootTest
@RunWith(SpringRunner.class)
publicclassHttpClientTest{
@Autowired
privateHttpClientServicehttpClientService;
@Test
publicvoidgetTest1(){
//次url是通过nginx加hosts文件映射的,需要修改url才可以使用
Stringurl="http://manage.jt.com/web/item/findItemDescById";
Mapmap=newHashMap<>();
map.put("itemId","562379");
Strings=httpClientService.doGet(url,map);
System.out.println(s);
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。