springboot整合httpClient代碼實(shí)例
這篇文章主要介紹了springboot整合httpClient代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
創(chuàng)建httpClientConfig配置類
@Configuration
@PropertySource(value="classpath:/properties/httpClient.properties")
public class HttpClientConfig {
@Value("${http.maxTotal}")
private Integer maxTotal; //最大連接數(shù)
@Value("${http.defaultMaxPerRoute}")
private Integer defaultMaxPerRoute; //最大并發(fā)鏈接數(shù)
@Value("${http.connectTimeout}")
private Integer connectTimeout; //創(chuàng)建鏈接的最大時(shí)間
@Value("${http.connectionRequestTimeout}")
private Integer connectionRequestTimeout; //鏈接獲取超時(shí)時(shí)間
@Value("${http.socketTimeout}")
private Integer socketTimeout; //數(shù)據(jù)傳輸最長時(shí)間
@Value("${http.staleConnectionCheckEnabled}")
private boolean staleConnectionCheckEnabled; //提交時(shí)檢查鏈接是否可用
//定義httpClient鏈接池
@Bean(name="httpClientConnectionManager")
public PoolingHttpClientConnectionManager getPoolingHttpClientConnectionManager() {
PoolingHttpClientConnectionManager manager = new PoolingHttpClientConnectionManager();
manager.setMaxTotal(maxTotal); //設(shè)定最大鏈接數(shù)
manager.setDefaultMaxPerRoute(defaultMaxPerRoute); //設(shè)定并發(fā)鏈接數(shù)
return manager;
}
//定義HttpClient
/**
* 實(shí)例化連接池,設(shè)置連接池管理器。
* 這里需要以參數(shù)形式注入上面實(shí)例化的連接池管理器
@Qualifier 指定bean標(biāo)簽進(jìn)行注入
*/
@Bean(name = "httpClientBuilder")
public HttpClientBuilder getHttpClientBuilder(@Qualifier("httpClientConnectionManager")PoolingHttpClientConnectionManager httpClientConnectionManager){
//HttpClientBuilder中的構(gòu)造方法被protected修飾,所以這里不能直接使用new來實(shí)例化一個(gè)HttpClientBuilder,可以使用HttpClientBuilder提供的靜態(tài)方法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的一個(gè)內(nèi)部類
* 通過RequestConfig的custom方法來獲取到一個(gè)Builder對象
* 設(shè)置builder的連接信息
* @return
*/
@Bean(name = "builder")
public RequestConfig.Builder getBuilder(){
RequestConfig.Builder builder = RequestConfig.custom();
return builder.setConnectTimeout(connectTimeout)
.setConnectionRequestTimeout(connectionRequestTimeout)
.setSocketTimeout(socketTimeout)
.setStaleConnectionCheckEnabled(staleConnectionCheckEnabled);
}
/**
* 使用builder構(gòu)建一個(gè)RequestConfig對象
* @param builder
* @return
*/
@Bean
public RequestConfig getRequestConfig(@Qualifier("builder") RequestConfig.Builder builder){
return builder.build();
}
}
創(chuàng)建HttpClientClose關(guān)閉配置類
@Component //交給spring容器管理
public class HttpClientClose extends Thread{
@Autowired
private PoolingHttpClientConnectionManager manage;
private volatile boolean shutdown; //開關(guān) volatitle表示多線程可變數(shù)據(jù),一個(gè)線程修改,其他線程立即修改
public HttpClientClose() {
///System.out.println("執(zhí)行構(gòu)造方法,實(shí)例化對象");
//線程開啟啟動(dòng)
this.start();
}
@Override
public void run() {
try {
//如果服務(wù)沒有關(guān)閉,執(zhí)行線程
while(!shutdown) {
synchronized (this) {
wait(5000); //等待5秒
//System.out.println("線程開始執(zhí)行,關(guān)閉超時(shí)鏈接");
//關(guān)閉超時(shí)的鏈接
PoolStats stats = manage.getTotalStats();
int av = stats.getAvailable(); //獲取可用的線程數(shù)量
int pend = stats.getPending(); //獲取阻塞的線程數(shù)量
int lea = stats.getLeased(); //獲取當(dāng)前正在使用的鏈接數(shù)量
int max = stats.getMax();
//System.out.println("max/"+max+": av/"+av+": pend/"+pend+": lea/"+lea);
manage.closeExpiredConnections();
}
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException();
}
super.run();
}
//關(guān)閉清理無效連接的線程
@PreDestroy //容器關(guān)閉時(shí)執(zhí)行該方法.
public void shutdown() {
shutdown = true;
synchronized (this) {
//System.out.println("關(guān)閉全部鏈接!!");
notifyAll(); //全部從等待中喚醒.執(zhí)行關(guān)閉操作;
}
}
編寫工具類HttpClientService
@Service
public class HttpClientService {
@Autowired
private CloseableHttpClient httpClient;
@Autowired
private RequestConfig requestConfig;
/**
* 通過給的url地址,獲取服務(wù)器數(shù)據(jù)
* @param url 服務(wù)器地址
* @param params 封裝用戶參數(shù)
* @param charset 設(shè)定字符編碼
* @return
*/
public String doGet(String url, Map<String,String> params,String charset) {
if (StringUtils.isEmpty(charset)) {
charset = "utf-8";
}
//判斷是否有參數(shù)
if (params != null) {
url +="?";
for (Map.Entry<String,String> entry: params.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
url += key +"="+value+"&";
}
url = url.substring(0,url.length() - 1);
}
HttpGet httpGet = new HttpGet(url);
httpGet.setConfig(requestConfig);
String result = "";
try {
CloseableHttpResponse response = httpClient.execute(httpGet);
if (response.getStatusLine().getStatusCode() == 200) {
result = EntityUtils.toString(response.getEntity(),charset);
}
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
return result;
}
public String doGet(String url, Map<String,String> params) {
return doGet(url,params,null);
}
public String doGet(String url) {
return doGet(url,null,null);
}
public <T> T doGet(String url,Class<T> tClass,Map<String,String> map, String charSet){
String result = doGet(url,map,charSet);
return ObjectMapperUtil.toObject(result, tClass);
}
}
測試類:
@SpringBootTest
@RunWith(SpringRunner.class)
public class HttpClientTest {
@Autowired
private HttpClientService httpClientService;
@Test
public void getTest1() {
//次url是通過nginx加hosts文件映射的,需要修改url才可以使用
String url = "http://manage.jt.com/web/item/findItemDescById";
Map<String,String> map = new HashMap<>();
map.put("itemId","562379");
String s = httpClientService.doGet(url, map);
System.out.println(s);
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
java實(shí)現(xiàn)的統(tǒng)計(jì)字符算法示例
這篇文章主要介紹了java實(shí)現(xiàn)的統(tǒng)計(jì)字符算法,涉及java針對字符的遍歷、判斷、運(yùn)算等相關(guān)操作技巧,需要的朋友可以參考下2017-10-10
Mybatis自動(dòng)創(chuàng)建表和更新表結(jié)構(gòu)
這篇文章主要介紹了Mybatis自動(dòng)創(chuàng)建表和更新表結(jié)構(gòu)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06
mybatis-plus自帶QueryWrapper自定義sql實(shí)現(xiàn)復(fù)雜查詢實(shí)例詳解
MyBatis-Plus是一個(gè)MyBatis(opens new window)的增強(qiáng)工具,在 MyBatis的基礎(chǔ)上只做增強(qiáng)不做改變,MyBatis可以無損升級為MyBatis-Plus,這篇文章主要給大家介紹了關(guān)于mybatis-plus自帶QueryWrapper自定義sql實(shí)現(xiàn)復(fù)雜查詢的相關(guān)資料,需要的朋友可以參考下2022-10-10
詳解@Autowired(required=false)注入注意的問題
這篇文章主要介紹了@Autowired(required=false)注入注意的問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
SpringBoot3.2.2整合MyBatis Plus3.5.5的詳細(xì)過程
這篇文章給大家介紹了SpringBoot3.2.2整合MyBatis Plus3.5.5的詳細(xì)過程,文中通過代碼示例給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-01-01
java數(shù)據(jù)結(jié)構(gòu)-堆實(shí)現(xiàn)優(yōu)先隊(duì)列
通常都把隊(duì)列比喻成排隊(duì)買東西,大家都很守秩序,先排隊(duì)的人就先買東西。但是優(yōu)先隊(duì)列有所不同,它不遵循先進(jìn)先出的規(guī)則,而是根據(jù)隊(duì)列中元素的優(yōu)先權(quán),優(yōu)先權(quán)最大的先被取出,這篇文章主要介紹了java數(shù)據(jù)結(jié)構(gòu)-堆實(shí)現(xiàn)優(yōu)先隊(duì)列,感興趣的朋友一起看看吧2021-08-08
深入解析堆排序的算法思想及Java代碼的實(shí)現(xiàn)演示
堆排序基于二叉堆結(jié)構(gòu)即完全二叉樹,可利用最大堆和最小堆的組建方式來進(jìn)行排序,這里就來深入解析堆排序的算法思想及Java代碼的實(shí)現(xiàn)演示2016-06-06

